ランダムな見知らぬ人からのソースコードをコンパイルすることはどれくらい安全ですか?[閉まっている]


41

求職者がスキルを証明するために送信するコードをレビューするとします。明らかに、彼らが送信する実行可能ファイルを実行したくない。それほど明確ではありませんが、コードのコンパイル結果を実行したくないのです(たとえば、Javaではコメント内の実行可能なコードを非表示にできます)。

コードをコンパイルするのはどうですか?私のコンパイラを悪用する巧妙な文字シーケンスがコードに含まれていて、コンパイラがマシンを危険にさらしている場合はどうでしょうか?

「コンパイラーの脆弱性」をGoogleで検索すると、コンパイラーの最適化とコードの発行、および発行されたコードが元のソースコードの意図どおりに安全であるかどうかがヒットします。

コンパイラーは通常、いくつかの巧妙なコードをコンパイルするときにユーザーマシンを危険にさらさないように検証されていますか?見知らぬ人からのコードをコンパイルすることはどれくらい安全ですか?


40
仮想マシンを使用してください...
Florian Margaine

14
実際にコードを確認している場合、気付かれずに「ユーザーマシンをパウニングする」ほど難しいものを取得するのは非常に難しいでしょう。
-RemcoGerlich

17
では、彼らのスキルをどのように判断しますか?これは、求職者から送られてきたコードを頻繁にレビューしたことがあるので尋ねますが、いつも読んでいるだけで、実行の必要性を感じたことはありません。
RemcoGerlich

9
Javaでは、実行可能なコードをコメント内に隠すことができます。すべてのJava IDEが構文の強調表示を行うときにUnicode変換を実行するわけではありませんが、これはリモートでは同じではありません。
ピートカーカム

68
コードを読まないでください。彼らはあなたの脳の脆弱性を悪用する可能性があります。
ヘンリック

回答:


34

場合によります。

このmakefileは、ホームディレクトリを削除する可能性があります。

all:
    rm -rf ~

したがって、ツール(cmakeやmakefileシステムなど)を使用する必要がある場合、安全ではありません。コーダーがどれだけ悪意があるかによって異なります。

一方、コンパイラは人によってプログラムされるため、バグが発生します。そのため、コンパイル中に悪意のあるコードを実行する方法を誰かが見つけた可能性があります。

コメントで示唆されているように、おかしなことがマシンに行われていないことを確認したい場合は、仮想マシンを使用します。


32
「仮想マシンを使用する」-もしあなたが本当に妄想なら、複数の欠陥を悪用することで、マルウェアが潜在的にあなたのVMから登り、あなたを絞殺する可能性があることを覚えておいてください(venom.crowdstrike.com
Steve Jessop

23
@SteveJessopええ、ネストされたVMを使用する方がよい;)おそらく、コーダーは1つのVMから抜け出したのに気づかず、まだ他のVMの中にいることになります。
ルスラン

3
または、古いラップトップを使用してコードをテストします。ネットワーク機能がない限り、マルウェアが飛び出すことはありません。ソフトウェアのバグが魔法のように具体的なバグに具体化しない限り。
マスト

5
@Ruslan:残念ながら、ほとんどのハッカーはInceptionを目にしています。
スティーブジェソップ

2
@Ruslanこれは文字通り、このページの前に開いたタブです。matrix.wikia.com / wiki / Matrix_in_a_Matrix_theoryで、SciFi SEサイトでの無関係な質問のために読んでいました。
アルマーニ

23

ビジネスのどこかに、特定の言語とコンパイラのバージョン用にそのようなハックをすでに作成している賢い人がいると確信しています。このようなものを探すのに私のお気に入りの場所は、おそらく国際難読化Cコンテストでしょう(Javaに匹敵するものがあるかどうかわからない)。ただし、現実には、リスクをどの程度考慮しますか?

  • 申請者はあなたにもっともらしい印象を与えます。彼はあなたの会社での仕事を本当に望んでいます(訴訟ではありません)

  • 男はあなたのレビューがどれだけ行われているのか分からない

  • 彼/彼女はあなたが使用している正確なコンパイラバージョンを知りません

  • 彼/彼女はあなたが仮想環境を使用するかオンラインコンパイラを使用するかを知らない、ただ安全のために

  • 効果的にレビューするには大きすぎるプログラムは受け入れません。

  • 疑わしいものは何もコンパイルしません

  • このようなタスクを技術的に達成する方法を実際に知っている人は、世界にはあまりいません(そして、グーグルだけでは、これについての「クイックリファレンス」やチュートリアルは提供されません。

したがって、理論的にはコンパイルは「完全に安全」ではありませんが、実際には、IMHOは「コンパイラが破損する」リスクが非常に低いです。


15
難読化は良好です。 弱者の方が良い。underhanded-c.org

11
「申請者があなたの会社での仕事を本当に望んでいます(訴訟ではありません)」申請を送った見知らぬ人が本当に仕事を望んでいるかどうかは明らかではありません。
クリスチャン

@クリスチャン:明らかに。しかし、もし後者が彼の仕事の要求に関して少なくとももっともらしい外観を思い付かなかったら、OPは申請者のコードのレビューに時間を投資しないだろうと思います。また、見知らぬ人はおそらく訴えられたくないでしょう。私の要点は、上記の各点はそれ自体で回避されるかもしれませんが、すべて一緒になっていますか?それは非常に低いリスクです。
Doc Brown

13

いくつかのケースを区別する必要があります。

  1. コンパイラのバグ。すべての複雑なプログラムと同様に、コンパイラにはバグがある場合があり、それらのバグの1つが悪用される可能性があります。
  2. トロイの木馬。攻撃者は、コンパイルプロセスの一部として、任意のコードを実行させる可能性があります。A Makefile、a build.xmlconfigureシェルスクリプトなど。技術的には、これは攻撃者のコードをコンパイルするためではなく、コンパイル環境を設定するためです。
  3. コンパイル時に任意のコードを実行できる言語。Scalaのマクロ言語はScala、Common Lispのマクロ言語はCommon Lisp、Template Haskellのマクロ言語はHaskellです。Scalaにはコンパイラプラグインもあります。これも、コンパイル時に実行される任意のScalaコードです。F#には型プロバイダーがあります。
  4. コンパイル時にチューリング計算を可能にする言語。ScalaとHaskellの型システムはチューリング完全であり、C ++のテンプレートも同様です。コンパイラーにコンパイル時に任意のチューリング計算を実行させることができます。これには無限ループが含まれますが、これに限定されません。チューリング完全とは、すべてのチューリング計算可能な関数を計算できることを意味するだけであり、ファイルシステムなどにアクセスできることを意味するわけではないことに注意してください。ただし、コンパイルに無限に時間がかかるプログラムを作成できます。
  5. 非常に長いコンパイル時間。たとえば、C#のオーバーロード解決のルールは非常に複雑であるため、3-SAT問題をC#オーバーロード解決としてエンコードできます。3-SATは、もちろんNP完全です。つまり、現在の知識では、C#のオーバーロード解決のための効率的なアルゴリズムを見つけることは不可能です。コンパイルを無限に長くすることはできませんが、コンパイルを宇宙の寿命よりも長くするのに大きなプログラムは必要ありません。これは実質的に同じです。

#4。#5。せいぜいサービス拒否になります。実際には、C ++およびScalaコンパイラは実行できる再帰の量を制限しているため、実際には無限ループを作成することはできません。Scalaでは、これは単なる実装上の制約ですが、C ++では、仕様で明示的に許可されていると思います。

#2。質問はそれを実行しないコードのコンパイルに関するものだったため、技術的には質問の範囲外です(OTOH、深い哲学的な質問があります:Haskellプログラムの型チェックが任意のチューリング計算を実行できる場合、そのコンパイルまたはプログラムの実行ですか?)

#1。ありそうもない。一方では、実動コンパイラーは非常に複雑であるため、バグの可能性が高くなります。一方、それらは厳密にテストされています。結局、不正な形式の入力を適切に処理することは、コンパイラのジョブ記述の一部です。たとえテストされていなくても、とにかく不正な形式のコードで攻撃されます...ジャンクの人がコンパイラーに投げかけるものの例については、StackOverflowの質問を見てください!

これにより、3が残ります。一部のコンパイラは、システムへのコンパイル時コードのアクセスの種類を制限する場合がありますが、一部のユースケースでは、完全なアクセスが避けられません。たとえば、F#の型プロバイダーの目的は、型システムがF#に一致しないデータの合成型を「偽造」することです。これにより、たとえば、厳密に型指定されたWSDLスキーマを持つWebサービスと対話できますファッション。ただし、これを行うには、タイププロバイダーがファイルシステムまたはWeb上のWSDLスキーマリソースにアクセスできる必要があるため、ファイルシステムとネットワークにアクセスできる必要があります。

だから、それは安全ですか?技術的にはありません。危険ですか?あんまり。


1
実際、C ++は、テンプレートのインスタンス化の深さを実装依存の値に制限します。これは数十個でした。最近の実装では、制限が数百に引き上げられています。それでも、レベルごとにテンプレートのインスタンス化の数を2倍にすることは完全に簡単なので、100レベルではコンパイラが2 ^ 100のテンプレートをインスタンス化する必要があります。それはただDoS攻撃までです。
–MSalters

3

コードをコンパイルするだけではリスクはありません。で理論賢いハッカーはを活用するが、極めてまれな音である可能性があり、コンパイラのバグがある可能性があります。

建物は安全でない可能性があることに注意してください。たとえば、C#の「ビルドイベント」では、ビルドの前後に実行する任意のコマンドラインを指定できます。これは明らかに危険であり、コンパイラコードでバッファオーバーフローを言うよりもはるかに簡単です。


3
Scala、テンプレートHaskell、ほぼすべてのLispは、コンパイル時に任意のコードを実行できます。チューリング完全型システム(Scala、Haskell)を使用するすべての言語は、コンパイル時に無限ループを含むがこれに限定されない任意のチューリング計算を実行できます。C ++のテンプレートシステムはチューリング完全であり、コンパイル時に無限ループを含む任意の計算を実行できます。C#のオーバーロード解決は3-SATと同等であるため、NP完全であり、チューリング完全ではありませんが、必要に応じて、ユニバースの存続期間中はコンパイラをハングさせることができます。
ヨルグWミッター

3
チューリング完全型システムでは、コンピューターを使用できませ。最悪の場合、悪用するとコンパイラがハングします。ただし、コンパイル手順で任意のコードを実行できる言語がある場合は、信頼できないコードをコンパイルしないでください。
ジャックB

3

推測する代わりに、私は実際に答える前にこのトピックに関するいくつかの研究を行うことに悩まされ、私が考えることができる最も権威のあるリソース(CVE Details)に行きます。一般に公開されているセキュリティ攻撃の包括的なリストは、おそらく、さまざまな種類のソフトウェアの脅威レベルを評価するためにできる最善の方法です。

もちろん、入手可能なすべての資料を読む時間はありませんでしたが、いくつかの「プライマリ」コンパイラ、IDE、およびテキストエディタを選択して、サンプルの脅威評価を考え出しました。ソフトウェアの実行を真剣に考えている場合は、少なくともどのような脅威が存在するかを確認する必要があります。また、古いソフトウェアは一般的に新しいソフトウェアよりもバグが多いため、実行中の最新のソフトウェアを実行することが理想的です。

まず、さまざまなテキストエディタを見てみましょう。最高のエディターは最もシンプルなようです。Linuxシェルを使用している場合はVi、Windowsを使用している場合はメモ帳。書式設定機能、解析なし、データの単純な表示、および単一の文字が現在のエンコードスキームの外にある場合の解析の自動終了を備えたもの。Notepad ++でさえ、いくつかの脆弱性があります。信頼できないファイルを表示するときは、複雑なものは避けてください。

第二に、IDEを見ることができます。IDEでファイルを開くことを選択した場合、いくつかのIDEがバグを報告していることに注意する必要があります。どうやらVisual Studioにはエクステンションメカニズムを介して利用可能なエクスプロイトがあったため、ソリューションを開くことが問題になる可能性があります。IDEを回避することで、ユーザーと信頼できないコードとの間のあらゆるクラスの問題を回避できます。VIを使用する方がはるかに安全です。

第三に、実際のコンパイラを見ることができます。Adobe、Microsoft、Java、GNUのC / C ++を含むいくつかを閲覧し、一般的に言って、コードのコンパイル(およびカスタムメイクファイルがないと仮定してビルドすること)は比較的安全であることがわかりましたが、これらのコンパイラはそれぞれコンパイルされたバイナリを実際に実行することから生じる可能性のあるセキュリティ上の脆弱性があります。言い換えれば、彼らは単にコンパイルするだけでシステムを引き継ぐことはできませんでしたが、コードを実行することはできました。

したがって、結論として、配信方法がシステムをハイジャックしていないと仮定すると(たとえば、電子メールクライアントがハッキングされたり、USBクライアントが感染した...)、ソースコードを読んでソースコードをコンパイルすることはおそらく安全です。特定のソフトウェアを調査することにより、たとえば、ファイルが正しいコードページにあることを検証するなどして、さらに安全にすることができます。コードの実行は、単に気にしないハードウェアでのみ実行する必要があります。VMではなく、ネットワークアクセスや機密ファイルや外部デバイスのない物理的に異なるコンピューター全体。あなたはあっても考えても、コンパイラは隠されたバッファオーバーフローを許す可能性があるバグが後ろからこっそりと任意のコードを実行するために悪用していること、しかし、あなたはに選択した場合にのみ、あなたがコードを理解シンプルな研究ショーをプログラムを実行またはデバッグします。実際のコンパイルは安全なはずです。


2

まあ、私は「彼らのコードをレビューする」ことから始めます。コードを実際に実行する必要があるのはなぜですか?

それとは別に、コードを入れてコンパイルおよび/または実行できるオンラインコンパイラがたくさんあります。あなたはそれを要件にすることができます:それはこのオンラインコンパイラでコンパイルします。

オンラインコンパイラを使用したページの例を次に示します。オンラインコンパイラ

就職の面接のためのレビューのためのコードは、あなたが何が起こっているのかを理解しないほど大きくはならないはずです。


3
「なぜ実際にコードを実行する必要があるのですか?」もちろん、それが良いかどうかを調べるために、レビューはその失敗が微妙であることだけを伝えます:-)。「上記のコードのバグに注意してください。正しいことを証明しただけで、試したことはありません。」-クヌース
スティーブジェソップ

2

コンパイラーは通常、いくつかの巧妙なコードをコンパイルするときにユーザーマシンを呼び出さないように検証されていますか?

一般に、それらは複雑すぎて、しばしばこの特性を証明するのが実用的でない言語を使用して書かれています。

おそらくこの特定の意図ではありませんが、コンパイラのファジーテストの概念は少なくとも知られています(LLVMはそれ自体をファジーテストできるようになりました)。コンパイラーのバグによりコンパイラーをクラッシュさせる入力をキャッチすることを目的としたテストも、悪用可能な欠陥を発見する傾向があります。

当然、潜在的なクラッシュを見つけるために、興味のある特定のコンパイラーがテストまたはファズテストされているかどうか、また、見つかったバグが実際に修正されているかどうかを調べる必要があります。経験則では、メモリ不足の例外よりも深刻なクラッシュが発生した場合、詳細をさらに調査することなく、エクスプロイトに悪用される可能性を深刻に考慮する必要があります。

見知らぬ人からのコードをコンパイルすることはどれくらい安全ですか?

残念ながら、文字列の長さはどれくらいですか。原則として、メールがコンパイラに届く前に、メールがメールクライアントを悪用したり、ソースコードがテキストエディタやcppcheckを悪用したりする可能性があります。オンラインコンパイラを使用するというセバスチャンのコメントの提案はかなり良いものですが、もちろん、コードはコンパイラが受け入れる形式でなければなりません。

一般的なコードをコンパイル時に実行する機能を備えた言語またはコンパイラは、もちろん非常に疑わしいものです。C ++テンプレートは機能的には完全ですが、システムへの(意図された)アクセス権がないため、比較的リスクは低くなります。BЈовићはmake、非常にリスクが高いと述べています(見知らぬ人のコードを実行しているため、たまたまそのコードがmakeC ++ではなく言語で記述されているためです)。コンパイラが実行される場合、system同じボートにいます。以前は、アセンブラで作業していたので、正しく覚えていれば、コンパイル時に任意のコードを実行できました。ルックアップテーブルの計算を目的としていましたが、システムコールの実行を妨げるものはないと思います。

実際には、コードに問題がないように見え、理解できると思うなら、コンパイルするのは非常に低いリスクで、「ロックダウンされたブラウザでインターネットを閲覧する」よりもはるかに低いリスクだと思います。私は汎用マシンで日常的に危険なことをしていますが、それらの多くは、たとえばウイルス研究室や重要なサーバーでは行いません。コードがおかしくなったり、明らかに難読化されている場合は、コードをコンパイルするリスクはないかもしれません。読み取り不可能なガーベッジに隠されたエクスプロイトが含まれている可能性があるため、それはゴミコードです。アンダーハンドコードは困難ですが、可能です。コンパイラのエクスプロイトを介してマシンを手渡すアンダーハンドコードには、重要な実行可能ペイロードを含める必要があるため、非常に困難です。

さらに詳しく調べたい場合は、オンラインコンパイラをホストしている人に聞いてみてください。それが彼らに行われていない場合(NSAまたは同等のものの注意を引くことを除いて)、あなたはそれがあなたに行われないと合理的に仮定することができます。彼らはコンパイラを適切なサンドボックスで実行するためにある程度の努力をしましたが、これはあなたが進んで行くよりも多くの努力かもしれませんが、少なくとも、そのサンドボックスがそれらをトラブルから救う頻度を伝えることができるかもしれません。


ユタ大学のJohn Regehr教授の研究により、clangとgccはかなり集中的なファズテストを実施し、コンパイラをクラッシュさせたり、他のコンパイラとは異なる動作をするコードを生成したりする可能性がある何百もの欠陥を打ち出しました。探すべきものは、まだ開いているバグと、それらが十分な脅威であるかどうかです。
フィルミラー

@Novelocrat:同意し、具体的な情報に感謝します。私の恐れは、コンパイラ開発チームが「誰もそのコードを書くことはない」ためにバグを低優先度と評価する可能性がありまだ修正されていないことですが、コンパイラを攻撃面と考えたら、それらは重要です。念のために、コンパイラーライターが、バッファー書き込みオーバーフローのような恥ずかしいものを放置しないようにすることを願っています;
スティーブジェソップ

1

これは一般的に懸念事項ですが、セットアップのために問題は存在しないと思います。

申請者からソースコードが送られてきました。どのように、またはなぜそれが起こったのですか?

明らかに3つの可能性があります。

  1. 応募者に、特定の(明確な)問題を解決して彼のスキルを評価する課題を与えました。
  2. 応募者は、自分が書いたクールなものを見せびらかしたいと考えています。
  3. 応募者は、ジャーク、スパイ、または悪意のある人物であり、実際に雇用されることに興味はありません。彼が望んでいるのは、あなたが彼のコードを実行するのに十分愚かであることです。

2)および3)について

主なリスクは、2)と3)を区別することです。彼が書いたものが見て価値あるなら、それはあなたがオンラインのソースコードを(「中立」ソースから)得ることができるものであり、あなたがすでに知っているかもしれないか、または実際にあなたがするものである可能性が高い競合他社(元雇用主)の知的財産を侵害するためたくない。後者は、とにかくその人を雇いたくないことを意味します。
ソースをオンラインで入手できる場合は、そうしてください。クレジットのどこかで有名なソフトウェア(プロプライエタリなソフトウェアを含む)への申請者の貢献を彼の名前で確認できる場合は、確認してください。
それ以外の場合は、彼があなたに送ったものは何でも無視してください。見る価値がないか、違法であるか、高リスクです。

約1)

あなたが彼に課題を与えたので、申請者はあなたに何かを送りました。あなたが持っている場合は任意の(私はあなたが想定し!)能力を、その後、一般的なプログラミングの割り当てのための(...あなたも自分で選んだ!)、あなたはそれがうまくいくかもしれないルックスかのようなことをもっともらしいソリューションですか伝えることができるようになりますソースコードを30秒未満(通常は10秒)見てください。

プログラムがおそらく30秒以内に動作する(または何をしているのか)ことを伝えることができない場合、それを書いた人はあなたが雇いたい人ではなく、フルストップです。他の人間が理解して保守できるコードを書いている人が欲しい。あなたはあなたを賢くしようとしている人も、難読化されたCコンテストに定期的に勝つ人も欲しくない。プログラムが機能するかどうかは関係ありません。他の人がコードを理解できないとすぐに、「機能」することはありません。
プログラムはおそらく動作するように見えますが、「奇妙」に見えるもの(たとえば、Javaユニコードエスケープシーケンス、C ++の生の文字列リテラル、トライグラフのようなものなど)を見つけたら、割り当てを「失敗」として扱い、移動します次の申請者に。すべてのプログラムの99%に同様のものを含める必要はありません(そして、確かに、あなたの割り当てではなく、私は願っています)。そのため、そのような「奇妙な」ものを見つけた場合、応募者はあなたが雇いたいと思う人ではありません。

コードが最初のトリアージに合格した場合は、さらに2〜3分かけてコードを詳細に確認することができます。それでも満足な結果が得られない場合は、静的アナライザーで実行し、警告レベルの高い仮想マシンでコンパイルすることができます。

これにより、ソースの読み取り中に見逃した可能性のある問題(未定義の動作の呼び出しや変換の絞り込みなど)が発生するはずです。
コンパイルすることは何よりもまず、申請者がプログラミングのスキルを持っているかどうかではなく、必要な勤勉さと細部への注意を持っているかどうかを示します。アプリケーションに雇用主の名前を正しく記述し、CVを渡す前にCVのスペルチェックを行うのと同じように、渡すソースコードはエラーなしで(できれば警告なしで)コンパイルすることを確認することをお勧めします。誰かがそれを怠った場合、あなたは彼を雇いたくありません。

この時点で悪事が発生するリスク(コンパイラ悪用し、VMから抜け出す)は無視できます。コードに対して既に妥当性チェックを実行していることがわかります。起こらない


0

可能性が心配な場合は、古いマシンを使用し(ほとんどの人が座っているのではないでしょうか?)、Linuxとコンパイラーの現在のバージョンをインストールし、ソースコードをコピーし、ネットワークケーブルを取り外します(またはWiFiをオフにします) )、コンパイルを実行します。厄介なことが起こったとしても、他には何も影響しません。

また、Makefile内のマルウェアについては、-nフラグ(IIRC、RTMF)を付けて実行し、実際に実行せずに何が実行されるかを確認します。

*もちろん、プログラマーがマルウェアをコーディングして再接続を待つようにしましたが、その場合はa)マシンを消去します。b)彼の履歴書をNSAに転送します。なぜなら、彼は商業の世界で無駄になっているからです:-)


0

一番下の行は、リスクがあるということです。他の回答が指摘するように、リスクはかなり小さいですが、リスクがあります。つまり、次の2つの質問をする必要があります。

  1. リスクを軽減するために何ができますか?
  2. リスクは気にする必要があるほど高いですか?

2つ目は、この質問でここであなたが主張したことですが、この特定のケースの焦点は間違っています。リスクを軽減するための答えは明確で、すぐに入手できますマシンでコードをコンパイルしないでください。マシンを使用せずにコンパイルするには、次の2つの明らかな方法があります。

  1. 仮想マシンを使用します(@FlorianMargaineがコメントですぐに指摘したように)。コンパイルする前にスナップショットを作成し、完了したらスナップショットを復元します。
  2. ホストされたサービス(オンラインコンパイラなど)を使用します。

リスクを軽減するこれらの方法は非常に明白で、安価で、簡単にアクセスできるため、リスクの大きさを分析するために多くの時間を費やす価値はありません。そのうちの1つを実行するだけで完了です。


0

信頼できない場所(ダウンロードされた場所やネットワーク共有など)からプロジェクトを開くと、Visual Studioは実際に警告します。

これを悪用する方法の1つの例は、WPFプロジェクトの場合です。XAMLから.NETクラスを参照し、IntelliSenseを提供するために、VSは設計時に参照されたクラスをロードして実行します。

つまり、攻撃者は悪意のある.dllをbinディレクトリにドロップし、ソースコードを悪意のないものに置き換え、設計時にDLLを実行できます。最初のビルドの後、悪意のあるバイナリの痕跡はすべてなくなりました。

そのため、提供されたコードはすべて「クリーン」であり、コンパイラにはバグがなく、もちろん、提供された.EXEを手動で実行することはありませんが、悪意のあるコードはバックグラウンドで実行されます。(その特定の攻撃から安全にするために、ソリューションを開く前にディレクトリツリーにバイナリがないことを確認することができます。VSはデザイン時にIntelliSenseを提供する前にソリューションをビルドするように促します。)

同様のベクトルは、おそらく他の言語/ OSにも存在します。


0

ソースコードの読み取り:完全に安全。ソースコードのコンパイル:完全に安全。コンパイルされたバイナリの実行:まあ...それは依存します。

コンパイルは、コンピューターがソースコードを読み取り、同等のバイナリ形式で書き込むだけです。コンパイル後、2つのドキュメントのみが得られます。1つは人間が読み取り可能なドキュメントで、もう1つはコンピューターが読み取り可能なドキュメントです。コンピュータに2番目のドキュメントを読み取らせる(実行する)場合を除き、何も起こりません。


3
コンパイルが完全に安全である理由の説明はありますか?巧妙に作成されたメッセージを送信することでサーバーを作成できます。なぜ、巧妙に作成された入力を与えてコンパイラを作成できないのでしょうか?
sharptooth

2
サーバーまたはコンパイラの脆弱性を悪用するように設計された巧妙に作成されたコードに気付くと思います。しかし、これを極端に考えて、なぜコードを表示するリスクを冒すのでしょうか?!エディタには、ファイルを表示するだけで悪用される可能性のある悪用がいくつかあります
gbjbaanb

2
この答えは完全に意味不明です。コンパイラが本質的に安全である、または少なくともSSL接続のセットアップなどの単純なタスクを実行するものよりも少なくとも安全である理由はまったくありませんが、最近人気のあるライブラリには脆弱性が含まれていました。コンパイラは一般に(インターネットなどの)敵対的な環境では使用されないため、コンパイラは脆弱性のチェックが少なく、したがってコンパイラを使用する可能性が高いとさえ主張します。
ドルス

1
コードのコンパイルが完全に安全かどうかはわかりません。Javaでも、たとえばMaven mvn packageを使用すると、不注意な " "で、物を引っ張ったり、簡単には分からない追加のプラグインでタスクを実行したりできます。同じことが他のビルドシステムにも当てはまると思います。
ブルーノ

1
チューリング完全言語では、コンパイラが無制限の時間実行できる場合、プログラムはコンパイルに無制限の時間を費やすことができますが、多くのコンパイラは、コンパイルされているコード。つまり、一度に1つのプログラムをコンパイルしようとするとCPUの負荷が制限されます。潜在的に大きな問題は、ディスク容量の要件です。1KBのソースファイルがオブジェクトコードの多くのギグを生成する可能性があることは完全に妥当です。
supercat

-1

次の2つのフレーバーのいずれかについて心配していると思います。

  • 洗練されたエクスプロイト駆動型マルウェア:可能性が低い、特にこれらは非常に特定のハードウェアおよび/またはソフトウェアを対象としているため、[あなたの質問に基づいて]攻撃者はおそらくそのレベルのシステム知識を持っていません。
  • 環境に悪影響を及ぼすもの:悪意のあるいたずらディレクティブ(例:ホームディレクトリの削除)またはシステムの動作を変更する不適切な/不適切なディレクティブ(例:PATHまたはLIBRARY環境変数の書き換え)

一部の人々は仮想マシンまたは古いシステムを提案しましたが、私ははるかに簡単なソリューションを提供します:異なる/異なる権限を持つユーザーとしてコンパイルします。仮想マシンや専用コンピューターをセットアップするよりもはるかに簡単です。

万が一、システムがコンパイル時のエクスプロイトによって苦しめられたとしても、バックアップから復元してください(それらがありますよね?)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.