ni.zsh v1.8.0リリース: Socket Firewallによるパッケージインストール時のチェック機能を追加
npm/yarn/pnpm/bunを同じコマンドで扱えるni.zshのv1.8.0をリリースしました。
このバージョンでは、Socket Firewallを統合し、パッケージのインストールと実行時にサプライチェーン攻撃から保護する機能を追加しました。
ni.zshについては、次の記事を参照してください。
- npm/yarn/pnpm/bunを同じコマンドで扱える ni のzsh実装を書いた | Web Scratch
- ni.zsh: npmインストール時のサプライチェーン攻撃を検知する機能を追加 | Web Scratch
ni.zsh v1.8.0の変更点
主要な変更点は次の通りです。詳細はリリースノートを参照してください。
🛡️ Socket Firewallの統合
Socket Firewallを統合し、パッケージのインストール時にセキュリティスキャンを行えるようになりました。
Socket Firewallは、HTTPプロキシとしてパッケージマネージャのネットワーク通信をインターセプトし、悪意のあるパッケージがダウンロードされる前にブロックするツールです。
従来のni.zshでは、Socket.dev APIを使ってリスクスコアを取得し、インストール前に確認を求める仕組みでした。 Socket Firewallも基本的には同じで、自動的にインストール時にマルウェアならブロックし、潜在的なマルウェアは警告を表示します。
詳しくは次の記事を参照してください。
セットアップ方法
Socket Firewallの機能を使用するには、次の手順でセットアップします。
- Socket Firewallをグローバルにインストール
npm i -g sfw
.zshrc
に環境変数を追加
export NI_USE_SOCKET_FIREWALL=1
設定後、次のコマンドでSocket Firewallによる保護が有効になります。
保護対象のコマンド
次のコマンドでSocket Firewallによる保護が有効になります。
ni
/ni add <pkg>
- パッケージのインストールni exec <cmd>
/ni dlx <pkg>
- パッケージの実行
ni.zshでは、パッケージをインストールする可能性があるコマンドのみを選択的にSocket Firewallを通すように実装されています。これにより、alias npm="sfw npm"
のような全コマンドをプロキシする方法と比べて、余計なSocket Firewallのログが出力されず、必要な時だけ保護機能が動作します。
# パッケージインストール時に保護
ni add express
# 直接実行する場合も保護
ni dlx create-vite
マルウェアパッケージがブロックされると、次のように表示されます。
=== Socket Firewall ===
- Blocked npm package: name: lodahs; version: 1.0.0
カスタムバイナリパスの指定
デフォルトではsfw
コマンドを使用しますが、カスタムのSocket Firewallバイナリパスを指定できます。
export NI_SOCKET_FIREWALL_BIN=/path/to/custom/sfw
なぜSocket Firewallを統合したか
最近のnpmエコシステムでは、サプライチェーン攻撃が急増しています。
過去にはevent-stream攻撃のような稀な事例でしたが、2024年から2025年にかけて次のような有名パッケージの侵害が相次いで発生しています。
これらの攻撃では、メンテナのアカウントが乗っ取られたり、マルウェアが連鎖的にマルウェアとなるnpmパッケージを公開しています。
Socket Firewallによる多層防御
Socket Firewallは、HTTPプロキシとしてネットワーク通信をインターセプトし、既知のマルウェアパッケージを自動的にブロックします。
これはnpmパッケージ/GitHub Actionsを利用する側/公開する側でサプライチェーン攻撃を防ぐためにやることメモで書いていた多層防御の一環として位置づけられます。
- ロック: version pinning / lockfile固定
- 事前スキャン: Socket.dev等で既知リスク検出
- インストール: Lifecycle Scriptsの制御、minimumReleaseAge
- アップデート: Renovate/Dependabotのcooldown(7日)
- 検証・改ざん検出: 署名/checksum/lockfile整合性確認
Socket Firewallは、この多層防御の「事前スキャン」段階の保護をするイメージです。
ni.zshは複数のパッケージマネージャ(npm、yarn、pnpm、bun)をラップするため、どのパッケージマネージャを使用していてもSocket Firewallによる保護を受けられます。
次のようにそれぞれのパッケージマネージャをsfw
でラップするエイリアスするのと大体似たような動作になります。
alias yarn="sfw yarn"
alias pnpm="sfw pnpm"
alias npm="sfw npm"
alias bun="sfw bun"
alias npx="sfw npx"
Socket.dev APIとの違い
ni.zshでは、以前からSocket.dev APIを使ったマルウェア検知機能を提供していました。
Socket.dev APIは、パッケージのリスクスコアを取得して、インストール前に確認を求める仕組みでした。
基本的な機能性は同じですが、Socket Firewallは次のような違いがあります。
機能 | Socket.dev API | Socket Firewall |
---|---|---|
検知方法 | APIでリスクスコアを取得 | HTTPプロキシでネットワーク通信をインターセプト |
保護レベル | インストール前に確認を求める | 既知のマルウェアは自動的にブロック |
セットアップ | APIキーが必要 | APIキー不要(無料) |
対応パッケージマネージャ | npm/yarn/pnpm/bun | npm/yarn/pnpm/pip/uv/cargo |
Socket Firewallは無料で使えて、APIキーも不要なため、よりシンプルに使えるようになりました。
なお、従来のSocket.dev API機能は削除しました。警告が出ても意識的にチェックしない場合が多く、ブロックするか通すかの明確な判断の方が実用的だと考えたためです。もしSocket Firewallが間違ってパッケージをブロックした場合は、直接npm
やyarn
などのコマンドを使用することで回避できます。
まとめ
ni.zsh v1.8.0では、Socket Firewallを統合してパッケージのセキュリティ保護機能を追加しました。
Socket Firewallを有効にするには、sfw
をインストールしてNI_USE_SOCKET_FIREWALL=1
を設定するだけです。
フィードバックがありましたら、GitHubのIssueでお知らせください。
お知らせ欄
JavaScript Primerの書籍版がAmazonで購入できます。
JavaScriptに関する最新情報は週一でJSer.infoを更新しています。
GitHub Sponsorsでの支援を募集しています。