web-dev-qa-db-ja.com

Composer PHPコードが自分で作成したものではないコード)の120,000行以上を「精査」する方法を教えてください。

私はPHP CLIをあらゆる種類の個人的および(できればすぐに)プロフェッショナル/ミッションクリティカルな「ビジネスロジック」に依存しています(これは他の言語でもかまいませんが、まったく同じ問題が依然として発生します) ;私は、コンテキストのために個人的に使用するものを述べているだけです。)

可能な限り、すべてを自分でコーディングしています。どうしても必要な場合にのみ、しぶしぶサードパーティのライブラリを使用します。ある場合には、これは単に必要です。たとえば、電子メールの解析など、非常に複雑なものです。

このようなサードパーティのライブラリを管理するために、私は PHP Composer を使用します。 PHPのライブラリマネージャーです。ライブラリとその依存関係をダウンロードし、他の「パッケージマネージャー」と同様のコマンドで更新することができます。実際には、これは手動で追跡し、Zipファイルを手動でダウンロードして解凍し、あらゆる種類の問題に対処するよりもはるかに優れています。それは少なくとも実際的な頭痛の多くを救います。

ただし、最も根本的なセキュリティの問題はまだ解決されていません:この「インストールされた」コードが何なのかわかりません含まれていますが、更新ごとに何が追加/変更されるのかわかりません。ライブラリの作成者の1人がmy Composerが更新をフェッチすると、私のPHP CLIスクリプトが突然Bitcoin wallet.datを送信する原因となるいくつかのリモートサーバーにRAT /トロイの木馬をマシンにインストールするか、さらに悪いことに、実際にはすでに起こっている可能性があり、私は賢明ではありません。

私のコードベースは合計で約15,000行です。そのコードベースを入念に検討するのに1年以上かかります。そして、それは[〜#〜] i [〜#〜]が書いたコードであり、私が親密に知っている...

私の "Composer"ディレクトリツリーは、現在120,000行以上のコードにあります。そして、これは最小数のcrucialPHP必要なライブラリです。私は非常に使います少数ですが、さまざまな依存関係があり、自分のコードと比較して全体的に非常に肥大化/膨張する傾向があります。

これらすべてを「精査」する方法はありますか?!それは決して起こりません。私も試みた直後に「ゾーンアウト」しました。 自分のコードの別の「獣医ラウンド」をどのようにして行うのかさえわかりません-他の人がコーディングしたこの10倍のコードは言うまでもありません。

「サードパーティのコードを精査する」ことが「必須」であると人々が言うとき、彼らは正確にはどういう意味ですか?それは「必須」だということにも同意しますが、厄介な現実があります。私には、これを行うための時間とエネルギーは決してありません。また、他の誰かにそれを行うために支払うお金は明らかにありません。

Docker について学ぶために数え切れないほどの時間を費やし、これらの信頼できないサードパーティのライブラリを何らかの方法で「カプセル化」できる方法があるかどうかを確認しましたが、それは敗戦です。それを実現することはまったく不可能であるか、またはそれに関する私の多くの質問のいずれかが答えられました。想像できるようなことはないと思います。

86

個々のコード行を検証することはできません。あなたはそれをしようとして死ぬだけです。

ある時点で、あなたは誰かを信頼する必要があります。 1984年に、Unixの多くの共同発明者の一人であるケントンプソンは、 trusts の制限に関する短い記事を書きました。ある時点で、他の人を信頼する必要があります。テキストエディタを書いた人が、PHPインタプリタがビットコインを盗むマルウェアに実行するトロイの木馬コードを自動的に隠していないことを信頼しなければなりません。 。

調査するものに優先順位を付けるには、費用便益分析を行う必要があります。

ほとんどの場合、コードの作成者、プロジェクトの内部セキュリティ慣行、およびコードがどのように届くかを精査するために、できる限り最善を尽くす必要があります。実際にコードをレビューすることは高価で難しいので、プロジェクトにとって最も重要であると考える部分のために予約する必要があります。

このライブラリーは、立派な会社やその背後にある有名なプロジェクトを持つ多くの人々が使用する人気のあるライブラリーですか?プロジェクトには適切なプロジェクト管理プロセスがありますか?ライブラリにはセキュリティ問題の過去の良い履歴があり、それらはどのようにそれらを処理しましたか?処理する必要があるすべての動作をカバーするテストはありますか?独自のテストに合格していますか?次に、誰にも気付かれずにライブラリが危険にさらされるリスクが軽減されます。

より詳細な調査のためにいくつかのサンプルファイルを取得します。そこについて何か見ましたか?取り込んだいくつかのファイルに大きな問題がある場合、おそらく残りのコードベースにも同様の問題があると推測できます。見た目が良ければ、コードベースの残りの部分も同様に適切に記述されているという確信が持てます。非常に大規模なコードベースでは、さまざまなレベルのコード品質を持つコードのさまざまな領域があることに注意してください。

パッケージマネージャーリポジトリはパッケージの署名をチェックしますか?パッケージをリポジトリに登録するために必要な事前審査システムはありますか、それともオープンな登録リポジトリですか?ライブラリは、ソースコードの形式で、またはプリコンパイルされたバイナリとして受け取りますか?これらは、ライブラリをどの程度信頼できるか、リスク要因、および信頼をさらに向上させる方法に影響します。

また、アプリケーションとアプリケーションが実行される実行環境についても考慮する必要があります。これは国家安全保障コード用ですか?このコードは、eコマースまたは銀行の一部であり、クレジットカード番号を扱いますか?このコードはスーパーユーザーとして実行されていますか?このコードは生命/安全にとって重要ですか?さまざまな特権(例:コンテナー、VM、ユーザー権限)でコードを分離して実行するための補完的なコントロールはありますか?このコードは週末のサイドプロジェクトですか?これらの質問にどのように答えるかで、コードの審査にどれだけ投資できるか、したがってどのライブラリをどのレベルで、どのライブラリを審査する必要があるか、どのライブラリを信頼度が低くても問題ないかを優先する方法の予算を定義できます。

140
Lie Ryan

私の "Composer"ディレクトリツリーは現在、120,000行を超えるコードです。そして、それは私が必要とする重要なPHPライブラリの最小数のためです。

あなたの間違いは、あたかもそれがあなた自身のものであるかのようにサードパーティのコードを吟味しようとすることです。それを行うことはできませんし、すべきではありません。

どのライブラリも名前で言及していませんが、- Laravel または-などのより大きなフレームワークの1つを使用しているため、かなりの量のライブラリがあると想定します。 symfony 。このようなフレームワークには、他の主要なライブラリと同様に、独自のセキュリティチームがあります。問題には迅速にパッチが適用され、アップデートのインストールは簡単です(サポートされているリリースを使用している場合)。

自分ですべてのコードを精査するのではなく、手放してベンダーが行ったことを信頼する必要があります。結局のところ、これがサードパーティのコードを使用する理由の1つです。

現実的には、サードパーティのPHPライブラリは、 。NET やJavaなどのコンパイルされた環境でサードパーティのライブラリを扱うのとまったく同じように扱う必要があります。これらのプラットフォームでは、ライブラリはDLLファイルまたは類似ファイルとして提供され、ソースコードを見ることができない場合があります。あなたはそれらを吟味することはできませんし、しようとしないでしょう。 PHPライブラリに対する態度がそれと異なる場合は、その理由を自問する必要があります。あなたがコードを読むできるからといって、それを行うことから何かを得られるわけではありません。

もちろん、これがすべて失敗するのは、サードパーティのライブラリに、サポートされていない、またはセキュリティポリシーがない小さなライブラリが含まれている場合です。したがって、これは、使用しているすべてのライブラリーについて尋ねる必要がある質問です。それらは完全にサポートされていますか、そしてそれらに安心できるセキュリティポリシーがありますか。そうでない場合は、それらのライブラリの代替を見つけることを検討してください。しかし、それでも、実際にサポートを引き継ぐつもりでない限り、自分でテストする必要があるわけではありません。

ただし、1つ追加します。PHPコードでセキュリティ監査を行う場合は、 RIPSスキャナー を使用することを強くお勧めします。安くはありませんが、強力なセキュリティ要件がある場合は、PHP用に入手できる最高の自動セキュリティ分析ツールです。間違いなく、独自のコードで実行してください。あなたはそれがいくつの問題を取り上げるかに驚かれるでしょう。もちろん、十分に偏執狂であれば、サードパーティのライブラリでも実行できます。それでもあなたにはもっと多くの費用がかかります、そして上記の私のポイントはまだ残っています。サードパーティベンダーがこの種のことを自分で行うことを本当に信頼すべきです。

47
Spudley

コーディングの新しいパラダイムへようこそ。ライブラリの上にライブラリを使用しています。あなたが一人でいることはほとんどありませんが、自分で記述していないコードを取り込むときはいつでも、リスクを伴うことを理解する必要があります。

あなたの実際の質問はどうすればそのリスクを管理できますか?

ソフトウェアが実行することになっていることを理解する

多くの場合、ライブラリマネージャーは、そのコードが何をしているのかを高レベルで理解することに煩わされることなく、コードを平手打ちするための便利な方法になります。したがって、信頼できるライブラリコード 悪いことをする になると、何が起こったのかと思って、足を踏みにじられます。これは ユニットテスト が役立ちます。コードが何を実行するかをテストするためです。

ソースを知る

Composer(または任意のパッケージマネージャ)は、完全に不明なソースによって昨日ロールアップされたライブラリを含め、指定した任意のソースからインストールできます。ベンダーは非常に信頼できるソースなので、SDKを持っているベンダーからのパッケージを喜んでインストールしました。他の信頼できる作業を行うソースからのパッケージも使用しました(つまり、PHPプロジェクトの誰かがライブラリリポジトリを持っています)。ソースを盲目的に信頼すると、問題が発生する可能性があります。

完全に軽減することはできないリスクがあることを受け入れる

2016年、単一のNodeJS開発者 大量のパッケージを不自由にした 彼らがプロジェクトを終了し、ライブラリの非公開を要求したとき。それらには、他の何百ものパッケージが依存関係としてリストされている1つの単純なライブラリがありました。あるいは多分 インフラストラクチャはパッケージ配布を処理するように構築されていなかった だからランダムに失敗する。インターネットは、分散ソフトウェア開発の世界で「物事をうまく機能させる」のが得意であり、人々はそれが機能しなくなっただけで動揺したり混乱したりする傾向があります。

PHP 7.0が出たとき、7.0環境で関数を使用するオープンソースのサードパーティソフトウェアパッケージを作成するのに多大な労力を費やさなければなりませんでした。私の側では、かなりの時間がかかりました。しかし、私はそのパッケージの作成者がいくつかの問題を解決して7.0環境で使用できるようにすることができました。代替策はそれを置き換えることでした...これにはさらに時間がかかります。そのパッケージは非常に便利であるため、私たちが受け入れるリスクです。

27
Machavity

ただし、最も根本的なセキュリティの問題は依然として解決されません。この「インストールされた」コードに何が含まれているかはわかりません。また、更新ごとに何が追加または変更されるのかわかりません。ライブラリの作成者の1人がmy Composerが更新をフェッチすると、私のPHP CLIスクリプトが突然Bitcoin wallet.datを送信する原因となるいくつかのリモートサーバーにRAT /トロイの木馬をマシンにインストールするか、さらに悪いことに、実際にはすでに起こっている可能性があり、私は賢明ではありません。

OpenSSLの巨大なセキュリティホール Heartbleed を調べてください。 Heartbleedは、最初の最後の数百または数千(ネットワーク暗号化)トランザクションをプレーンテキストとして保存し、それを知っている人がリモートで接続してユーザーが考えたすべてのメモリキャッシュトランザクションを取得するための簡単でログなしの機能を残すことで、SSLを効果的に弱体化しましたプレーンテキストで安全に暗号化されました。その時までに、OpenSSLは自己ホスト型Webサイトの大多数と膨大な数の銀行、さらには政府のインテリジェンスサービスさえも保護していました。

次に、最新のIntel CPUに組み込まれた巨大なバグ Meltdown および Spectre を調べます。 MeltdownとSpectreは、CPUを保護モードで実行することを完全に打ち消し、OSから独立しているため、すべてのオペレーティングシステムで利用できます。

何年も前に MSBlaster と呼ばれるマルウェアが悪用されました(それがバグであるかどうかはわかりませんが、非常に愚かです)Windows XPバックグラウンドサービスこれは、デフォルトで実行されていてもビジネスがありませんでした。これは、非常に少数のWindowsユーザーによってアクティブに使用され、IT部門にしか知られていませんでした。これにより、最終的にISPはモデムデバイスに組み込まれたハードウェアファイアウォールを発行し、Microsoftを組み込みました。オペレーティングシステムに組み込まれたソフトウェアファイアウォール同時期に、「ウイルス対策」とされたLinuxプラットフォームのディストリビューションが、メジャーディストリビューションリリースに組み込みルートキットを含むことが発見されました。

他の人が言ったように:あなたはある時点で誰かを信頼する必要があります。事故も悪意も問題を引き起こします。私はあなたのようです-The X-Files-の大ファン アップリンク(TRUST NO ONE!)-しかし、実際には、SSL暗号化エンジンまたは物理ハードウェアデバイスセキュリティホールが存在する可能性が高く、ミッションクリティカルな障害が存在する場合、それらがはるかに発生する可能性が高くなります。

Composerホイールを自分とユーザーのセキュリティのために再発明するためにさらに1マイル進むことに真剣に取り組んでいる場合は、その1マイルに進むことについて真剣に考えてください。自分のCPU、メインボード、RAMを設計してください。 HDDとオプティカルドライブ。独自のOSとハードウェアドライバーを作成します。独自のコンパイラも作成します。PHPについては忘れてください。インタープリターに問題がある可能性があるためです。実際、CとC++についても忘れます。コンパイラに問題がある可能性があり、他の誰かが書いたアセンブラでアセンブリ言語について考えさえしないでください。独自のソフトウェアはすべて、16進エディタを使用して、機械命令でゼロから作成します。

または、業界のメンバーのように行動することもできます。 Composer/PHP/YourLinuxDistroのアップデートニュースレターを購読し、セキュリティベースの独立したニュースレターを入手して、Wired。システムログを確認します。 PCAPを使用してネットワークを定期的にテストし、不正なネットワークストリームが送受信されていないことを確認してください。可能性のある脅威の監視については積極的に行動し、まだ起こっていないことに偏執しないでください。

3
user116960

中級から上級レベルの開発者として、私は同じ問題を検討しました。考慮すべきいくつかのポイント:

  • Prioritizeセキュリティの目的で重要なコードを確認します。明らかに、これには認証とログインコード、権限の検証、支払いプロセッサの統合などが含まれます。機密情報を要求するもの、またはネットワーク呼び出しを行うもの。
  • 視覚的にスキムライブラリのスタイリングのようなもの-それらがスタイリングのみを行っていることをすばやく特定できるはずです-ユーティリティ関数のようなもの。大文字の文字列、空白の置換、配列の並べ替え...コードをすばやく読み飛ばして、予期しない動作をしていないことを確認できます。
  • 自分のコードのようにコードを完全にリバースエンジニアリングしていない場合でも、ソースを見て、意図したものかどうかを判断できるはずですリバースエンジニアリングに対して友好的であること。コードはdocumentedであり、有用なコメント、変数およびメソッド名は関連性があり有用である必要があります。関数と実装は長すぎたり複雑すぎたり、不要な機能を含んでいてはなりません。 目に非常に喜ばしいコードは、悪意のあるハッカーにとって好ましい攻撃方法ではありません。
  • コードに確立された成熟したユーザーベースがあることを確認します。あなたは、収益性が高く有名な会社が使用することが知られているプロジェクトに引き寄せたいと考えています。
  • リードコントリビューターの実際のIDを確認します。大規模なプロジェクトの場合、主な開発者は彼らの仕事の功績を喜んで受け入れます。ブログの投稿、ソーシャルメディアアカウント、そしておそらくコンサルティング業務のための履歴書やマーケティングページを見つけることができるはずです。 お問い合わせください!など.
  • 最近のバグ修正により、オープンソースコードがアクティブに維持されているであることを確認します。未解決のバグレポートを確認してください-少数になる可能性があります-特定のツールまたはライブラリにバグがないという主張を信用しないでください。それは妄想的な主張です。
  • 回避過度の広告が表示される「フリーウェア」サイト。デモサイトが利用できないプロジェクトや、デモが「醜い」、メンテナンスが不十分、頻繁にオフラインになるプロジェクトは避けてください。過度に宣伝されているプロジェクトや過度の流行語を避け、テストされていない優れたパフォーマンスを主張するプロジェクトは避けてください。匿名のブログからのダウンロードは避けてください。等。
  • 悪意を持って考える。あなたがあなたのサイトを壊したかったら、あなたは何をしようとしますか?安全でないコードを広く使用されているライブラリに忍び込ませたい場合、どのように実行しますか? (明らかに、実際にこれを試さないでください。)
  • Forkオープンソースプロジェクト、またはダウンロードバックアップ。好きなオープンソースプロジェクトの公式リポジトリがいつまでもオンラインのままであることを信頼しないでください。

したがって、コードのすべての1行を個別に読み取って理解するのではなく、what各ライブラリが行うことのアイデアを取得します。そしてwhyあなたはそれがそれをしていると信じています。あなたの仕事が利益を生むのであれば、プロジェクトの規模に上限はないと思います。 1,200,000行以上のコード、または120,000,000行以上のコードを「精査」できます!

Composerはcomposer.lockファイルし、デフォルトでは https://packagist.org/ を介してパッケージをダウンロードします(HTTPに注意してください)[〜#〜] s [〜#〜] したがって、巨大なパッケージリポジトリと安全なダウンロードがあり、SHA1チェックサムが付随しているため、一度指定したものを正確にダウンロードできます。それだけでもかなり役に立ちます。

依存関係の更新の保守的な側面にとどまっている場合は、パッケージバージョンが本番環境で使用されていることも期待できます。

しかし結局のところ、誰かを信頼する必要があります。自分自身を信頼してエクスプロイトフリーのコードを書くか、他の人と同じように、何千人もが使用し、さらに多くのユーザーに見られるコミュニティプロジェクトを信頼することができます。

でも結局のところ、あなたには選択肢がないと思います。他の人が「盲目的に飛んでいる」、つまり、実行したいセキュリティ監査なしで、「より安い」価格でより速い機能リリースで「あなたの」顧客を連れて行っている場合、とにかく安全な自己記述アプリケーションから誰も恩恵を受けることはありません。

0
knallfrosch