Skip to content
KitploitKITPLOIT
ツールエクスプロイトブログ
Log in
提出
ツールエクスプロイトブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

フィードお問い合わせプライバシー© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
POC-CVE-2026-102282 — CVE-2026-102282: アーカイブ展開時のSUID/SGID保持によるadm-zipのLPE(0.6.1で修正) | Kitploit
ツール/GitHubGitHub/ahmed-elmahgob/poc-cve-2026-102282
防御ツール特権昇格静的分析脆弱性スキャナー脆弱性分析エクスプロイトサプライチェーンセキュリティ学習と教育インシデントレスポンス
GitHubahmed-elmahgob/poc-cve-2026-102282

POC-CVE-2026-102282

CVE-2026-102282: アーカイブ展開時のSUID/SGID保持によるadm-zipのLPE(0.6.1で修正)

21時間7分前未レビュー

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有
リポジトリを見る

CVE-2026-102282 — adm-zip の展開時における setuid/setgid の保持

CVE GHSA CVSS 3.1

npm パッケージ adm-zip における不適切なパーミッション割り当て。keepOriginalPermission が有効な場合、展開時に信頼できない zip から setuid、setgid、スティッキービットが保持される可能性があり、攻撃者が用意したアーカイブから root 所有の setuid 実行ファイルをディスク上に設置できてしまう。すなわち ローカル権限昇格 である。

パッケージadm-zip (npm)
エコシステムNode.js
CVECVE-2026-102282
アドバイザリGHSA-j5f4-cc29-5x44
CWECWE-732 重要なリソースに対する不適切なパーミッション割り当て
CVSS v3.17.1 High — CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:N
影響を受けるバージョン< 0.6.1 (最後に確認された影響バージョン: <= 0.6.0)
修正済み0.6.1 (2026年9月11日)
公開日メンテナアドバイザリ 2026年9月11日、GitHub Advisory Database 2026年9月29日

このリポジトリには、解説記事、依存バージョンチェッカー、安全な ビヘイビアテスト、および資格情報コンテキストを表示するだけの無害な 検証用バイナリを中心に構成された自己完結型の概念実証が含まれている。

影響を受けるバージョン

0.6.1 より前のすべてのリリースが影響を受け、0.6.0 も含まれる。

範囲状態
>= 0 かつ < 0.6.1影響あり
<= 0.6.0最後に確認された影響バージョン
>= 0.6.1修正済み

このバグに到達できるのは、すべて の条件が真である場合のみである:

  • 呼び出し元が extractAllTo()、extractAllToAsync()、または extractEntryTo() に keepOriginalPermission=true を渡している。
  • アーカイブを展開するプロセスが root として、または後で展開されたファイルを実行するアカウントよりも特権的な別のユーザーとして実行されている。
  • アーカイブが信頼できないものである (アップロード、取得した成果物、ビルド入力、依存関係アーカイブ)。

デフォルトの展開ではこのフラグはオフであり、影響を受けない。非特権ユーザーとしての展開でもモードビットは適用され得るが、生成されるファイルは同じユーザーが所有するため、特権境界を越えることはない。

バグの内容

Unix のモードビットは、zip エントリの外部ファイル属性の上位 16 ビットに格納される。adm-zip はそれらのビットを展開先のパスにコピーする。

場所役割
headers/entryHeader.js — fileAttr外部属性から Unix モードを読み取る
adm-zip.js — extractAllTo、extractAllToAsync、extractEntryTokeepOriginalPermission が true の場合に fileAttr を使用する
util/utils.js — ファイル書き込みヘルパー内の chmodSync作成されたばかりのパスにそのモードを適用する
adm-zip.js のディレクトリ展開展開されたディレクトリに同じモードを適用する

0.6.0 以前では、fileAttr はシフトされた属性を 0xfff (0o7777) でマスクする。このマスクは通常の rwx ビットとともに 3 つの特殊ビットを保持し、書き込みパス内で chmod の前に 0o7000 をクリアするものは何もない:

// headers/entryHeader.js (<= 0.6.0)
get fileAttr() {
    return (_attr || 0) >> 16 & 0xfff;
}
  • setuid (0o4000)
  • setgid (0o2000)
  • スティッキー (0o1000)

トリガー

展開はアーカイブで制御されたモードをそのままファイルシステムに渡す:

// adm-zip.js
const fileAttr = keepOriginalPermission ? entry.header.fileAttr : undefined;
filetools.writeFileTo(entryName, content, overwrite, fileAttr);

// util/utils.js
self.fs.chmodSync(path, attr || 0o666);

0.6.x の呼び出しシグネチャに注意: extractAllTo(targetPath, overwrite, keepOriginalPermission) は第 3 引数としてリテラルの boolean を取る。 { keepOriginalPermission: true } のようなオプションオブジェクトを渡すと 暗黙的に false に変換され、脆弱性を実証する代わりにテストでマスクしてしまう。 このリポジトリの両方の PoC スクリプトは true を直接渡している。

修正

修正はコミット 6a63c339 (v0.6.1) である。fileAttr は 9 つの rwx ビットのみを保持するようになった:

get fileAttr() {
    return (_attr || 0) >> 16 & 0o777;
}

仕組み

  1. zip エントリは外部属性 (標準的な場所、16 ビットシフト) に Unix モードを格納する。
  2. keepOriginalPermission=true の場合、展開は fileAttr を通じてそのモードを読み取り、chmod に渡す。
  3. マスクが 0o7777 であるため、setuid、setgid、スティッキーが保持される。
  4. その chmod が root として実行されると、新しいファイルは root 所有となり、setuid を持つことができる。後でより低い特権のユーザーが実行すると、ファイル所有者のコードが root として実行される。
  5. 同じ経路がディレクトリにも適用される。setgid ディレクトリは、その後に内部で作成されるファイルのグループ継承を保持する。

フラグをデフォルトのままにしておくと、展開はアーカイブのモードを適用せず、特殊ビットは書き込まれない。

概念実証

すべては poc/ の下にある。同梱のペイロードは verify.c であり、実 uid/gid と実効 uid/gid を表示し、 デフォルトモードでは実効 ID でシェルを開く無害なプログラムである。 永続化や隠蔽などは行わず、資格情報コンテキストを実証する以外の ことは何もしない。

ファイル目的
poc/verify.c無害な setuid 検証用ペイロード
poc/build-archive.jsモード 0o4755 を持つエントリを含む zip にファイルをパックする
poc/extract.js影響を受けるアプリと同様に keepOriginalPermission=true でアーカイブを展開する
poc/run-demo.shエンドツーエンド実行: ビルド、root として展開、呼び出しユーザーとして実行

実行方法

git clone <this repo> && cd CVE-2026-102282
npm install [email protected]        # the version under test
sudo apt install gcc             # if needed

./poc/run-demo.sh                # uses /var/tmp/cve-2026-102282-demo
./poc/run-demo.sh /path/to/out   # or a custom output directory

0.6.0 に対する期待される出力:

== 3. extract as root with keepOriginalPermission ==
adm-zip version: 0.6.0
extracted /var/tmp/cve-2026-102282-demo/exploit.zip into /var/tmp/cve-2026-102282-demo/extracted
== 4. result on disk ==
4755 -rwsr-xr-x root:root
== 5. run as the unprivileged user (user) ==
uid=1000(user) ... 
[*] real  uid=1000 gid=1000
[*] eff.  uid=0 gid=0
[+] SUID active: effective uid 0 differs from real uid 1000

0.6.1 に対する期待される出力:

== 4. result on disk ==
755 -rwxr-xr-x root:root
== 5. run as the unprivileged user (user) ==
uid=1000(user) ...
[*] real  uid=1000 gid=1000
[*] eff.  uid=1000 gid=1000
[-] effective and real ids match: no SUID context

デモの注意点:

  • 展開ディレクトリは nosuid でマウントされて いない ファイルシステム上にある必要がある。スクリプトはそのマウントオプションを検出すると警告する。
  • スクリプトは素の root としての実行を拒否する (ステップ 5 で降格する非 root アカウントを持てるよう、自分のアカウントから sudo 経由で実行すること)。
  • クリーンアップは終了時に setuid ビットを剥奪し、出力ディレクトリを削除する。

ビヘイビアテスト

scripts/behavior-test.js は、root もペイロードも 使わずに、インストールされた adm-zip のコピーを直接検証する: 0o4755 を持つインメモリの zip エントリを構築し、 keepOriginalPermission=true で展開し、setuid ビットが保持されたかどうかを チェックする。

npm install [email protected] && node scripts/behavior-test.js   # -> exit 1, VULNERABLE
npm install [email protected] && node scripts/behavior-test.js   # -> exit 0, not vulnerable

影響

信頼できない zip を root として keepOriginalPermission=true で展開する アプリケーションやパイプラインにおけるローカル権限昇格。

この組み合わせは、Docker イメージビルド (デフォルトで root)、CI ジョブ、 および意図的にパーミッションを保持するインストールやデプロイのステップに 現れる。ファイルはモード保持コピー (cp -a、rsync) を通じてビルドから 抜け出し、後でランタイムユーザーによって実行される可能性がある。

公開された CVSS ベクターでは、ホストの機密性と完全性の両方が高である。 可用性はスコアに含まれない。攻撃はローカルである: 攻撃者は特権プロセスに よって zip を展開させ、その後、その結果をより低い特権で実行させる必要がある。

修復

adm-zip を 0.6.1 以降にアップグレードする。

npm install adm-zip@^0.6.1

推移的依存関係を含め、解決されたコピーを確認する:

npm ls adm-zip
node scripts/check-version.js .

すべてのコピーがアップグレードされるまで:

  • 信頼できないアーカイブを keepOriginalPermission=true で展開しないこと。
  • その展開を root として実行しないこと。専用の非特権ユーザーを使用すること。
  • フラグがオンだった場合、脆弱なバージョンから既に展開されたツリーは信頼できないものとして扱うこと。アップグレード後にクリーンな展開で置き換えること。

検出

  • 依存関係監査: npm audit、npm ls adm-zip、またはこのリポジトリのチェッカー (下記) が、プロジェクトやロックファイル内の脆弱なコピーを特定する。
  • ランタイムビヘイビア: scripts/behavior-test.js は、特定の環境が依然として脆弱な展開ビヘイビアを持つかどうかに答える。
  • インシデント後: アーカイブから展開されたツリー内で特殊ビットを持つファイルを探す。例: find /path/extracted -type f -perm /7000。信頼できないアーカイブから脆弱なバージョンを通じて展開されたツリー内でのヒットは、敵対的なものとして扱うべきである。

バージョンチェッカー

プロジェクト、adm-zip のインストール、またはパッケージ自体の package.json をチェックする:

node scripts/check-version.js /path/to/project
node scripts/check-version.js /path/to/project/node_modules/adm-zip/package.json
node scripts/check-version.js --self-test
ツールをダウンロード