目に見えないnpmマルウェア:特定のバージョン表現でセキュリティチェックを回避

不可见的npm恶意软件

npm CLI。npmパッケージをインストールする際、CLI はパッケージとその依存関係をすべてチェックして、既知の脆弱性がないか調べます。

检查已知漏洞的依赖关系

() () () () (npm安装(英文)npm审计★★★★★★★★★★★★★★★★★★★★★

これは,既知の脆弱性を持つパッケージを使用しないよう,開発者に警告を発する重要なセキュリティ対策につながります。

。……npm安装npm审计の両方において,特定のバージョン形式になっている場合,パッケージに対する脆弱性に関する警告が表示されないというもので,これらのパッケージを使用している開発者は重大な脆弱性やマルウェアを自分のシステムやnpmパッケージの間接的な依存関係として持ち込んでしまう可能性があります。

このブログでは,この問題の詳細,そして攻撃者が公開した悪意のあるパッケージのセキュリティチェックを回避するためにこの問題をどのように利用するのか,また開発者がこの問題に混乱させられないようにするにはどうすればよいのかについて詳しく説明します。

★★★★★★

いくつかのnpmパッケージで作業している際,npm CLIとJFrog x光で報告された脆弱性の間に興味深い不一致があることに気が付きました。

cruddl 2.0.0-update.2“。

npm CLI导致意外漏洞Xray识别Xray CVE-2022-36084漏洞

同じパッケージに対して,npmの発見した脆弱性は0件でしたが,x光は脆弱性を1件(cve - 2022 - 36084)発見しました。★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

(1)、(1)、(2)、(3)

いくつかの試行錯誤とパッケージのインストールを行ったところ,この不一致はインストールしたパッケージのバージョンにダッシュ/ハイフン文字(例:1.2.3-a)。? ? ? ? ?

パッケージをアップロードするとき,npmはセマンティックバージョニング(语义版本控制),,,,,,,,,,,node-semver★★★★★★★★2 .5.6.75.6.7-a

npm-install /审计ツールは,依存するすべてのパッケージとそのバージョンをjson(辞書形式)に収集し,批量咨询终端npm API。このエンドポイントは各パッケージとバージョンを調べ,バージョンをアドバイザリの影響範囲と一致させることで関連するアドバイザリを見つけようとします。。

今回確認したのは,大部分顾问端点はバージョンにハイフン(-)の後に追加文字を含むパッケージのセキュリティアドバイザリの取得に失敗するということです。

“?”?

(语义版本控制)仕様(1) . major.minor.patch (major.minor.patch)…第9項? ? ? ?プレリリースバージョンは”パッチバージョンの直後にハイフンとドット区切りの一連の識別子を付加する”ことで指定することができます(例:5.6.7-a)。

英文释义

npmエンドポイントのコードはクローズドソースであるため,問題がどこに起因しているかは推測するしかありません。

各アドバイザリには(サンプルはこちらから),(中文),(中文),(中文)> 6.6.0。。

node-semver(semver),(中文:)npmjpのドキュメント“预发布标签”()。

【翻译】

semver.满足("1.2.3-a", "> 0")

> > > > > >アドバイザリの作成者の意図としては全てのバージョンのパッケージをカバーすることだったので,これは非常に予想外なことかもしれません(例えば悪意のあるパッケージに対するアドバイザリを作成する場合など)。

“选项对象”includePrereleaseのフラグを設定することで,この動作を抑制できることも記載されています(レンジマッチングの目的,ですべてのプレリリースバージョンを通常版と同じように扱う)。

そこで,フラグを設定した状態で同じチェックを実行すると,

semver.satisfies(“1.2.3-a”、“> 0 ",{“includePrerelease”:1})

真正的> > > > > >

大部分咨询端点でこのフラグを有効にすると,通常のnpmパッケージのバージョンとプレリリースバージョンの間の不整合が解消されるはずです。

JFrogの公開した情報を受けて,この機能が期待される動作であることをnpmのメンテナー(管理者)から学んだので,この動作が変更されることはないと考えています。

(概念验证)

実際に致命的な脆弱性を持っていたパッケージであるcruddl()cve - 2022 - 36084)。

cruddl

发现严重安全漏洞

上記の代わりに,同じパッケージのプレリリースをインストールすることを選択した場合,

npm CLI导致意外漏洞

バージョン2.0.0-update.2はcve - 2022 - 36084の影響を受けているにもかかわらず,誤って”脆弱性が見つからなかった”と表示されます(修正版は2.7.0)。

我的意思是,我的意思是,我的意思是,我的意思是

攻撃者は,無害に見えるパッケージに脆弱性や悪意のあるコードを意図的に仕込み,他の開発者が価値のある機能,あるいは受害や依存関係の混乱などの感染技術によるミスとして取り込まれるなどの方法でこの動作を悪用することができます(例は,这是我的最爱()。

上記のように,攻撃者がプレリリースバージョン形式のパッケージを使用している場合,そのコードが悪意のあるコード・脆弱性として報告され,アドバイザリが作成されていたとしても, npm CLIはそのような勧告の存在については報告しないため,悪意のあるコード・脆弱性の含まれたパッケージに依存している開発者は何も知らされないままになります。

你是说?你是说?

開発者やDevOpsエンジニアに推奨するのは,そのパッケージが極めて信頼できるソースから提供されていると100%確信している場合を除き,プレリリースバージョンのnpmパッケージをインストールしないこと啊哈!。

次のコマンドラインを使用して,現在プレリリースバージョンのnpmパッケージがインストールされているかどうかを以下の方法で確認することができます。

Linux

npm list -a | grep - e @[0-9]+\.[0-9]+\.[0-9]+-

Windows

NPM list -a | findstr -r @[0-9]*\.[0-9]*\.[0-9]*-

JFrog

JFrog,セキュリティ・リサーチのブログ記事や推特@JFrogSecurity★★★★★★★