今週初め、AzerKoçuluは Node.js のデフォルトのパッケージマネージャーである npm から 彼のモジュールを非公開にする を決定しました。彼は合計 273モジュール を公開しました。
BabelやReactなどのいくつかの主要なモジュールは、それらの1つに依存していました: left-pad 、およびモジュールがもう見つからなかったため、多くのnpmインストールが失敗し始めました。 npmは同じバージョン番号を使用しない限り、破棄されたパッケージ名を再公開できるため、元のモジュールはCameron Westlandによってバージョン1.0.0としてすぐに再公開されました。
それから npmスタッフは元のバージョンを再公開することを決定しました 彼らはまだ多くのエラーを観察していました。
しかし、誰かがキャメロンよりも速い可能性があり、元のスクリプトではなく悪意のあるスクリプトをアップロードした可能性があります。パッケージは署名されていないため、悪意のあるスクリプトがダウンロードされ、数千回実行される可能性があります。
Npmには、攻撃者が未公開モジュールの悪名を悪用するのを防ぐメカニズムはありますか?
間違いなく。パッケージが危険にさらされる(または新しいパッケージが公開される)場合、インストールされ、使用されると、そのパッケージで提供されるコードが実行される可能性があります。したがって、たとえばnode.jsコンテキストで実行した場合、攻撃はファイルシステム、システム情報、ファイル実行、プロセスなどの多くのマシンレベルの機能にアクセスできます。攻撃者のコードをエクスポートで返されます。したがって、それらがrequire('bad-package')
になるとすぐにコードが実行されます。さらに悪いことに、モジュールをインストールするのと同じくらい簡単かもしれません。パッケージのマニフェストで preinstall script を指定して、スクリプトをすぐに実行できます。
間違いなく再び。 2015年1月26日、rimrafall
という名前のパッケージがNPMに公開されました。それは問題の意識を高めることでした。パッケージはプレインストールフックを実行するため、インストール直後にrm -rf /*
が実行されます。 Rimrafallは2時間以内に削除されましたが、 Github にあります。
開発者として信頼できる防止方法に近いのは、安全であることがわかっているバージョンへの package.json のバージョンロックです。バージョンロックは通常、既知の動作中の依存関係のみが使用され、テストされていない依存関係の更新によって何も破壊されないようにするために行われます。しかし、同じことが攻撃者のバージョンをかわすために使用できます。あなたが述べたように、特定のバージョンのファイルを再発行することはできません。 dependencies に正確なバージョンを設定すると、アプリケーションはこのバージョンのみをダウンロードします。攻撃者がパッケージの制御を取得する場合、悪意のあるコードを後のパッケージのユーザーにプッシュすることしかできません。攻撃者がNPMのサーバーを危険にさらした場合、彼らは以前のバージョンを好きなように変更できるので、「信頼性に近い」と言いました。
さらに、インストール時に--ignore-scripts
フラグを使用して、プレインストールスクリプト攻撃を防ぐことができます。これにより、インストールする機会が与えられますが、実行する前にコードを確認できます。 (パッケージにネイティブバイナリが含まれている場合を除きます。)インストールする前に、npm show $module scripts
を実行してそのようなスクリプトを確認できます。 NPMをミックスから外してスクリプトを確認する場合は、http://registry.npmjs.org/MODULENAME/-/MODULENAME-VERSION.tgz
から直接ダウンロードできます。
はいといいえ。非公開になると、すぐに悪用されるのを防ぐために、パッケージ名に保留が設定されます。ただし、NPMに要求した場合は引き続き入手できます。理論的には、単純なソーシャルエンジニアリングでは、審査プロセスをバイパスして、パッケージ名を攻撃者の手に渡る可能性があります。未公開のパッケージに関するメッセージは以下のとおりです。
このパッケージ名は現在使用されていませんが、以前は人気のあるパッケージで占められていました。悪意のある使用を回避するために、npmはパッケージ名に依存していますが、おおざっぱに言って、必要に応じてそれを提供します。
[email protected]に連絡して名前を要求することにより、このパッケージを採用できます。
最後に、攻撃者は未公開のパッケージを利用することができますか?はい、間違った人がすぐに所有権を取得した場合、コードでパッケージの更新をプッシュする方法には何もありませんでした。これにより、そのパッケージの最新バージョンをダウンロードしたり、バージョンの依存関係をロックしなかったプロジェクトをインストール/更新したりすると、だれでも危険にさらされます。
編集:依存関係には依存関係がある可能性があることに注意してください。したがって、依存関係自体は安全に見える可能性がありますが、それ自体の安全でない依存関係に読み込まれていないことを確認してください。