web-dev-qa-db-ja.com

ソースに対してバイナリを検証する方法はありますか?

プリコンパイルおよびパッケージ化されたソフトウェアの 完全な完全性パスを検証する に実用的な方法はないようです。ダウンロードしたパッケージ自体をハッシュで確認できますが、コンパイルされたバイナリが実際にパブリックソースコードを表しているかどうかは確認できません。

この問題の理論的な解決策さえありませんか?最良の場合、自動化できる方法ですか?

多分それを逆コンパイルして、その出力またはハッシュをソフトウェアプロバイダーが提供するものと比較しますか?

20
flori

コンパイル は、ほぼ一方向の操作であり、少なくとも堅牢な方法ではなく、確定的ではありません。

could ソースコードを再コンパイルして、同じバイナリが生成されるかどうかを確認します。ただし、正確なバイナリは、コンパイルオプションや使用するコンパイラの正確なバージョンなど、多くのパラメータによって異なる場合があります。さらに、一部のコンパイラーはいくつかの「コメント」をバイナリー・ファイルに組み込みます。コメントには、通常、コンパイラーのバージョンが含まれますが、「ビルド番号」(そのような番号が維持されている場合)、およびおそらくビルドの日付と時刻も含まれます-その中に場合、しない最後のバイトまでではなく、同じバイナリを取得します。 「同じ」バイナリを取得したかどうかを確認したい場合は、最初にそのようなコメントを削除する必要があります(UNIXのstripコマンドが役立つ場合があります)。

厳密に言えば、コンパイルはランダム化できます。最適なコードを生成することは難しい問題であるため、一部のコンパイラはランダム化されたアルゴリズムを採用しています。これは、ヒューリスティックに、平均的に優れています。このようなコンパイラは、毎回異なるバイナリを生成します could 。このような動作はデバッグをはるかに困難にするため、ヒューリスティックアルゴリズムに夢中になる多くのコンパイラーは、再現性を維持しようとします(つまり、ランダム性を [〜#〜] prng [〜#〜] でシードします特定の構成可能な値)。


より簡単な解決策があります。ソースコードがあり、それを再コンパイルできる場合は、 your 再コンパイルの出力を使用します。

もちろん、これは信頼の問題を完全に解決するわけではありません。動かすだけです。ソースからコンパイルする場合:

  • ソースコードにバックドアが含まれていないことを信頼する必要があります。
  • 悪質なトリックを行わないためには、コンパイラ自体を信頼する必要があります。

少なくとも、ソースコードは名目上人間が読み取ることができるため(つまり、ソースコードのポイントです)、コードを読み取る(または信頼できる専門家に読み取らせる)ことで、コードの分析を実行できます。特定のコードにバックドアや脆弱性が含まれていないことを確認する方法はありません(それ以外の場合は、バグのないコードを作成する方法を知っていることになります)。ただし、バックドアをソースコードで隠すことは、コンパイルされたバイナリよりもはるかに困難です。

コンパイラについては、こちらをご覧ください 非常に古典的な記事

20
Tom Leek

再現可能なビルド の概念は、この問題の解決策を提供するようです。少なくとも理論的なもの。

つまり、入力ソースが同じであれば、ビルド(またはコンパイル)プロセスを実行するたびに同じ出力が返されるはずです。

それを使用すると、新しく公開されたすべてのバイナリが、それが表すと主張するソースコードを本当に表している場合、私や他の人がクロスチェックする可能性があります。

ただし、この概念をすでにビルドプロセス(主にオペレーティングシステム)に実装しているプロジェクトはわずかです(2017年2月)。したがって、ほとんどの場合、このソリューションはまだ理論的なソリューションです。

1
flori