広告

npmはハッカーに狙われやすい?OSSの中でもセキュリティリスクが高い理由

2021年12月4日

OSS(オープンソースソフトウェア)の中でも特に人気のnpmですが、OSSサプライチェーン攻撃の主な対象となっているのはご存知でしょうか?

sonatypeの年次レポート[1]https://www.sonatype.com/hubfs/Q3%202021-State%20of%20the%20Software%20Supply%20Chain-Report/SSSC-Report-2021_0913_PM_2.pdf?hsLang=en-usによると、2021年にはOSSを対象としたサイバー攻撃は前年比で650%増加しており、セキュリティ対策は急務となっています。

攻撃対象にされやすいnpmパッケージ

ボン大学のセキュリティチームの調査[2]https://arxiv.org/pdf/2005.09535.pdfによると、パッケージ管理システムについて下記のように指摘しています。

攻撃者から見ると、パッケージリポジトリは、信頼性が高く、スケーラブルなマルウェア配布経路だ。今の所、Node.js(npm)とPython(PyPI)が主なターゲットとなっており、インストール時に容易に悪意あるスクリプトを実行できるからだろう」

Marc Ohm, et al, Backstabber’s Knife Collection: A Review of
Open Source Software Supply Chain Attacks

Node.js(npm)とPython(PyPI)がターゲットとなっている原因は、パッケージのインストール時などに、自由にスクリプトを実行できることから、容易に攻撃が可能であるためとされています。

中でも、npmは主要なパッケージエコシステムのなかでも圧倒的な人気を誇っていることから、最も攻撃対象にされやすいと言えるでしょう。2021年のNode.jsパッケージ数は約190万パッケージと、2位のPythonに4倍以上の差をつけており、ダウンロード回数も1.5兆回と郡を抜いています。

https://www.sonatype.com/hubfs/Q3%202021-State%20of%20the%20Software%20Supply%20Chain-Report/SSSC-Report-2021_0913_PM_2.pdf?hsLang=en-us

npmパッケージを狙った攻撃事例

UAParser.js

UAParser.jsは、ユーザーのブラウザやOSなどを検出するパッケージです。GoogleやMicrosoftなどにも採用されており、

毎週6〜700万回以上ダウンロードされている人気のパッケージですが、2021年10月にアカウントの乗っ取りにより、暗号資産の採掘やパスワードの盗難などを行うトロイの木馬が注入されました。

img
https://www.cadosecurity.com/links-to-previous-attacks-in-uaparserjs-compromise/

GitHubは、そのコンピュータの秘匿情報は外部に送信されている可能性があるため、すべて変更することを推奨しています[3]https://github.com/advisories/GHSA-pjwm-rvh2-c87w。また、パッケージを削除したとしても、すべての悪意あるソフトウェアが削除される保証はないとしています。

electorn

「electorn」は、タイプミス狙った悪意あるパッケージの1つです。このような攻撃はタイポスクワッティング(typosquatting)と呼ばれ、一般的な攻撃手法の1つです。

オリジナルのパッケージ名は、デスクトップアプリケーションのフレームワーク「electron」ですが、誤ってこのパッケージをインストールしてしまった場合、IPアドレスとそれにひもづく地理情報、ホームディレクトリパスなどを外部に送信するスクリプトファイルが実行されます。

image1
https://blog.sonatype.com/sonatype-spots-malicious-npm-packages

これらはいずれもパッケージインストール前に実行されるイベントフックpreinstallが起点となっており、package.jsonに一行加えるだけでスクリプトが実行できてしまうため、攻撃が容易であることがわかります。

npmのイベントフックとは?

package.jsonscripts には、イベントをフックした処理の実行が可能です。preinstall以外にも, パッケージインストール後のpostinstallや、パッケージ公開前に実行されるprepubishOnlyなどがあります。

package.jsonpreinstallイベントフックを設定してみると、下記のようにパッケージインストール時に実行されていることが確認できます。

"scripts": {
	"preinstall": "echo 'preinstall'",
},
$ npm install
> my-event-hook@0.1.0 preinstall
> echo 'preinstall'
preinstall

イベントフックは、パッケージの公開前にテストを実行するなどして、テストの通らないパッケージがnpmレジストリに登録されるのを防ぐなど、パッケージ開発を便利にする機能です。しかし、悪意あるスクリプトを注入するために悪用されてしまっているのが実情です。

イベントフックなど、npmの仕様について詳細を知りたい方は、npmの公式ドキュメントを参照してください。日本語で読みたい方や、npmを含めたNode.jsを体系的に学びたい方には、「ハンズオン Node.js」がオススメします。Node.jsの基礎から非同期処理、jestやmochaを使ったテストの実装方法に加え、npmについても解説されており、Node.jsを体系的に学ぶのにピッタリな本となっています。

¥4,070 (2021/12/05 19:00時点 | Amazon調べ)

まとめ

OSSの利用は、攻撃のリスクと隣合わせです。スクリプト1つでパッケージをインストールできるなど、利便性を享受できる反面、とくにnpmなどは大きなセキュリティリスクを抱えています。

今後さらにOSSサプライチェインを狙った攻撃は増加が予想され、OSSのセキュリティ対策が重要性を増してくるでしょう。

今回ご紹介したようなセキュリティリスクとその原因について知っておくと、OSSを狙った攻撃に対してどのように対処すべきか理解しやすくなります。具体的な対処方法はOWASP Top 10:2021の資料が参考になります。