npm/yarn/pnpm/bunを同じコマンドで扱えるni.zshのv1.8.0をリリースしました。

このバージョンでは、Socket Firewallを統合し、パッケージのインストールと実行時にサプライチェーン攻撃から保護する機能を追加しました。

ni.zshについては、次の記事を参照してください。

ni.zsh v1.8.0の変更点

主要な変更点は次の通りです。詳細はリリースノートを参照してください。

🛡️ Socket Firewallの統合

Socket Firewallを統合し、パッケージのインストール時にセキュリティスキャンを行えるようになりました。

Socket Firewallは、HTTPプロキシとしてパッケージマネージャのネットワーク通信をインターセプトし、悪意のあるパッケージがダウンロードされる前にブロックするツールです。

従来のni.zshでは、Socket.dev APIを使ってリスクスコアを取得し、インストール前に確認を求める仕組みでした。 Socket Firewallも基本的には同じで、自動的にインストール時にマルウェアならブロックし、潜在的なマルウェアは警告を表示します。

詳しくは次の記事を参照してください。

セットアップ方法

Socket Firewallの機能を使用するには、次の手順でセットアップします。

  1. Socket Firewallをグローバルにインストール
npm i -g sfw
  1. .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年にかけて次のような有名パッケージの侵害が相次いで発生しています。

  • tinycolor - 40以上のパッケージが侵害
  • chalk - ブラウザで実行するタイプのマルウェア
  • nx - AI Agentを使ってローカルの認証情報を盗み取る攻撃

これらの攻撃では、メンテナのアカウントが乗っ取られたり、マルウェアが連鎖的にマルウェアとなるnpmパッケージを公開しています。

Socket Firewallによる多層防御

Socket Firewallは、HTTPプロキシとしてネットワーク通信をインターセプトし、既知のマルウェアパッケージを自動的にブロックします。

これはnpmパッケージ/GitHub Actionsを利用する側/公開する側でサプライチェーン攻撃を防ぐためにやることメモで書いていた多層防御の一環として位置づけられます。

  1. ロック: version pinning / lockfile固定
  2. 事前スキャン: Socket.dev等で既知リスク検出
  3. インストール: Lifecycle Scriptsの制御、minimumReleaseAge
  4. アップデート: Renovate/Dependabotのcooldown(7日)
  5. 検証・改ざん検出: 署名/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が間違ってパッケージをブロックした場合は、直接npmyarnなどのコマンドを使用することで回避できます。

まとめ

ni.zsh v1.8.0では、Socket Firewallを統合してパッケージのセキュリティ保護機能を追加しました。

Socket Firewallを有効にするには、sfwをインストールしてNI_USE_SOCKET_FIREWALL=1を設定するだけです。

フィードバックがありましたら、GitHubのIssueでお知らせください。