私がアメリカ/イギリス以外の大規模なサービス組織で働いているとしましょう。私たちはUNIXとLinuxサーバーを広く使用しています。
最後まで読んでこの記事Cコンパイラにバックドアを挿入するのは簡単で、コンパイラを使用してコンパイルされたすべてのコードにもバックドアが含まれていることに言及しました。現在、すべての暗号化方法、ハードウェア、およびソフトウェアのバックドア/弱点を承認するNSA / GCHQの最近の漏洩に照らして、コンパイラは重要な障害点です。すべての標準のUNIX / Linixディストリビューションが破損する可能性があります。私たちは、当社のシステム、データ、および顧客データが不良政府によって侵害されることを許可することはできません。
この情報を使用して、最初から信頼できるコンパイラを構築し、セキュリティベースを確保し、そのコンパイラを使用してソースからオペレーティングシステムとアプリケーションを構築できます。
質問
ソースからコンパイラを構築し(一見鶏や卵が必要な場合)、信頼できるUnix / Linuxディストリビューションを最初からコンパイルする正しい(そして安全な)方法は何ですか?
私または他の人がソースコードのセキュリティ上の欠陥を読んで理解する能力があると仮定することができるので、コンパイルする前にまずソースコードを確認します。私が本当に望むのは、カーネル、オペレーティングシステム、およびアプリケーションの他の部分をコンパイルするために使用できるこのコンパイラを最初から安全に生成するための作業ガイドです。
スタック上で実行されているオペレーティングシステムまたはアプリケーションに自信を持っている場合は、セキュリティスタックを基礎レベルで起動する必要があります。はい、コンパイラがビルドされると、一部のマイクロコードをコンパイラに挿入できるハードウェアバックドアがある可能性があることがわかります。米国以外の場所で設計したチップを使用する以外に、現時点ではできることはありません。まず、このレイヤーを並べ替えてバックドアを挿入する前に、古いコンピューターでそれを構築できるとします。
ブルース・シュネルが言ったように、「私はエンジニアにこう言います。私たちはインターネットを作り、私たちのいくつかはそれを妨げるのを助けました。
追加リンク:
答え1
AFAIKは安全を完全に保証する唯一の方法はアセンブリ言語(または直接ディスクの修正)。これでコンパイラがバックドアを挿入しないことを確認できます。これは実際にコンパイラを完全に削除するので効果的です。
ここでコンパイラを使用して、最初からGNUツールチェーンなどをブートストラップできます。その後、カスタムツールチェーンを使用してコンパイルできます。最初からLinuxシステム。
作業を容易にするために、C(または他の言語)で書かれた2番目の中間コンパイラを持つことができます。したがって、コンパイラAをアセンブリとして作成し、そのコンパイラをC / C ++ / Python / Brainfuck /何でも再構築してコンパイラBを取得し、コンパイラAを使用してコンパイルします。次に、コンパイラBを使用してgccと友達をコンパイルします。
答え2
1つの可能なアプローチは根に戻ることですが、実際には時間がかかります。 GNUの開発は1984年に始まり、Minixの元のバージョン(初期のLinux開発中に起動目的で使用される)は1987年にリリースされました。
完全な答えは、「[あなた]または他の人がセキュリティ上の欠陥のソースコードを読んで理解する能力を持っているので、コンパイルする前にまずソースコードを確認します」という前提に基づいており、そのような分析結果を信頼できます。 。これがなければ、この答えはおそらく何の利益もなく多くの時間を費やすことになるので、おそらく役に立たないよりも悪いでしょう。
ソースコードを含む元のMinixブックのコピーが見つかった場合は、ブックから直接入力できます。これをコンパイルし、さまざまなシステムでさまざまなデコンパイラを使用して、コンパイラが予想される機械語バイナリ出力を生成することを確認します。 (コードは12,000行しかないのですが、おそらくC言語なので時間がかかりますが、それでも限界内にあります。理由このようなプロジェクトについて真剣に考えるなら。 )独自の逆アセンブラを作成することもできます。これはそれほど難しくありません。
手に入れることができる最も古いバージョンのGNUユーティリティを入手し(これらのバージョンはコードが少なく、外部ライブラリへの依存度が低いため)、コードを参照してMinix用にビルドします(ただし、少し作業が必要になる場合があります)。できること)確かに避けるべきことは、ソースコードを調整することです。これにより、後でパッチを追加するとエラーが発生しやすくなります。 GNUツールに似た逆アセンブリ検証サイクルを経ます。この時点ではOSとツールチェーンを信頼するので、パッチセットにあるソースコードだけを見るだけですが(パッチセットにないのはすでに信頼されています)、ツールに比べてツールは依然として非常に原始的で粗雑です。あなたは今日まで使用しています。たとえば、システムツールの最も基本的な機能が正常に機能することを期待しないでください。これで、すべてをMinixに転送して移行し、一度に1つのバージョンでパッチを適用し、各バージョン間で影響を受けるすべてを再構築し、次に新しいバージョンを使用します。XKCDをたくさん読んでください。
ある時点で、1990年代初頭にLinuxがハッカーに人気を集め始めたときと同様に、以前のバージョンのLinuxカーネルをコンパイルして起動できるシステムがあります。この時点でLinuxに移行することをお勧めします(Linux用のシステムライブラリとツールチェーンの再構築、Linuxカーネルの構築、Linuxへの起動、LinuxからLinuxカーネルとGNUツールチェーンの再構築、最終的にシステムが自己修復されることを証明)。しかし、これは主にあなた次第です。最新バージョンに達するまで、常にパッチを確認し、カーネル、ライブラリ、およびデフォルトのGNUツールをパッチして再構築します。
これで、最新のソフトウェアを構築するために使用できる信頼性の高い基本オペレーティングシステムとコンパイラが作成されました。その時点で、たとえば、次のことができます。最初からLinux性能を発揮するシステム構築ガイド効果がある仕事。
「コンパイラ」システムは、いかなる方法でも(ネットワークホストの仮想マシンを含む)ネットワークに接続しないでください。ネットワークサポートコンポーネント(カーネルを含む)に侵入する危険があります。気になるならトンプソンコンパイラ攻撃、すべてのVMホストも破損する可能性があることを期待する必要があります。 sneakersnetを使用してコンパイル中の物理ホストからソースコードとバイナリを取得します。少なくともUSB大容量記憶装置のサポートが実装されるまで、システムにファイルをインポートしてエクスポートするのに問題があると予想されます。本当に編集証がある場合は、ソースコードのリストを印刷して手動で入力してください(プリンタドライバとプリンタに同様のコードがないことを願っています)。それら)または1台のコンピュータモニタからコードを読み、物理的に隣にあるが接続されていない別のコンピュータに入力します。
はい、必要ですたくさん時間。しかし、このアプローチの利点は、各ステップが段階的であることです。つまり、複数のバージョンにわたって徐々に導入されない限り、すべての悪意のある動作は逃げにくいということです。これは、各ステップの変更が比較的少ないため、より簡単です。確認してください。パッチセットを変更ログと比較することで、ソースコードの各変更に対応する変更ログエントリを正確に確認できます。繰り返しますが、これは、そのような変更がまだコードベースに適用されていないことを確認する能力(おそらく信頼する人を介して)があると仮定します。ファームウェアを除いて、純粋なソフトウェアアプローチと同じくらい信頼できるシステムに近づく必要があります。
答え3
信頼できるコンパイラが必要な場合は、次の学術作品を見てください。電卓ライセンスプロジェクト。これはINRIA(フランスIT公共研究所)が構築したコンパイラで、「認証」を受けるように設計されています。つまり、コードと意味的にまったく同じ実行ファイルを生成するように設計されています(もちろん数学的に証明されています)。
答え4
開始点として独自のコンパイラを手動で作成するのが最も安全ですが、もう1つのオプションは、これらのエクスプロイトが悪用される前に作成されたと思われる5年(または10年)のインストールCDからシステムをインストールすることです。その後、これは新しい監査ソースをコンパイルするための基礎として使用されます。