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

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

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

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

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
prometheus-unix-socket-dial — Prometheus v3.15.0 - 高 - リモート - SSRF - http_sd __unix_socket__ 未サニタイズの Dial が UDS スクレイプに残存 | Kitploit
ツール/GitHubGitHub/abraxas/prometheus-unix-socket-dial
脆弱性分析エクスプロイトウェブアプリケーション悪用情報収集ペネトレーションテストラボと実践
GitHubabraxas/prometheus-unix-socket-dial

prometheus-unix-socket-dial

Prometheus v3.15.0 - 高 - リモート - SSRF - http_sd __unix_socket__ 未サニタイズの Dial が UDS スクレイプに残存

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

人気

すべて見る →

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

すべてのツールを探索

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

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

Abraxas Labs - prometheus-unix-socket-dial

abraxaslabs.tech  ·  github.com/abraxas  ·  @abraxas_null  ·  [email protected]  ·  prometheus-unix-socket-dial

prometheus-unix-socket-dial

クラス: SSRF 到達範囲: リモート

Prometheus v3.15.0 (5241a27) - CNCF / Prometheus

v3.15.0 で Unix Domain Socket スクレイプが追加された (#12024 / #18091)。そのパスはターゲットラベル __unix_socket__ であり、オペレータの許可リストではない。http_sd と file_sd はそのラベルをそのままコピーする。PopulateLabels はそれを一切検証しない。そして newUnixSocketScrapeClient は filepath.Clean も許可リストも ../ や Linux 抽象 @ 名の拒否もなしに DialContext(ctx, "unix", socketPath) を呼び出す。

TCP スクレイプではこれはできない。 CheckTargetAddress は依然として / を含む __address__ 値を拒否するため、アドレスとしての unix:///var/run/docker.sock は拒否される。新しいラベルが穴である。

標準設定ではこのラベルは設定されない。Prometheus への未認証 HTTP ではジョブを追加できない。これは SD ゲート型である。

IDCVE 未採番
クラスSSRF (SD ラベルからの未サニタイズ unix Dial)
到達範囲リモート (SD ゲート型: http_sd / file_sd の書き込み者)
CWECWE-918, CWE-22
CVSSHigh: 8.6 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:N/A:N
製品Prometheus
影響を受けるバージョンv3.15.0 (5241a27fe3c6983549fccc32f6e65917408c63cd)、イメージ prom/prometheus:v3.15.0
認証SD ゲート型: http_sd / file_sd ラベルの書き込み者 (または信頼できないメタデータを __unix_socket__ にコピーする relabel)
ライセンスGNU Affero GPL v3.0
ラボ127.0.0.1 のみ

攻撃者ができること

http_sd JSON (または書き込み可能な file_sd) の制御で十分である。SD URL はオペレータ設定である。残る問題は、グループの labels が __unix_socket__ を設定でき、Prometheus がそれを Dial してしまうことである。

権限メソッド / シンクラボ実証または推測
Prometheus UID が開けるホスト unix ソケットに接続clientForTarget -> __unix_socket__ からの DialContext(ctx, "unix", socketPath)ラボ実証済み。http_sd からのパス /sockets/jail/../oracle.sock、スクレイプヘルス up
そのパス内の ../ を辿るfilepath.Clean なし / .. 拒否なしラボ実証済み。カーネルがトラバーサルを /sockets/oracle.sock に解決
Linux 抽象ソケットを Dial@name の同じ Dialラボ実証済み。__unix_socket__=@prom-lab-oracle、スクレイプヘルス up
そのソケット上で Prometheus UID として HTTP GETスクレイプは GET、__metrics_path__ がリクエストパスラボ実証済み。GET /fs-traversal と /abstract、User-Agent Prometheus/、lab_witness が取り込まれた
TCP スクレイプでは指定できないソケットに到達CheckTargetAddress は __address__ 内の / を拒否ラボ実証済み。__address__ としての unix:///var/run/docker.sock は is not a valid hostname をログ出力、アクティブターゲットにならず、prometheus_target_sync_failed_total=1
それらのソケットが対象範囲内なら Docker Engine / kubelet HTTP API に GET__unix_socket__=/var/run/docker.sock と Docker API パス推測。同じ未サニタイズ Dial。このラボは実際のエンジンソケットをマウントしない。JSON API は通常 exposition パースに失敗するため、High は接続/GET であり、Docker JSON の TSDB 持ち出しではない
Docker を変更 (コンテナ作成、書き込み)スクレイプの動詞不可。スクレイプは GET のみ
未認証 Prometheus HTTP 経由でスクレイプジョブを追加/-/reload、admin API不可。両フラグともデフォルト無効、reload にはボディがない
デフォルトの example 設定でこれを使う__unix_socket__ 未設定、example は localhost:9090 を TCP でスクレイプ不可。ツリー内の k8s/consul/docker SD は __meta_* のみを出力し、それらのプレフィックスは relabel 後に削除される

ベンダーのセキュリティモデルは既に SD が TCP スクレイプターゲットを選択することを許容している。新しいプリミティブは __address__ では指定できなかったホスト IPC である。

発見の経緯

UDS スクレイプの 3.15 FEATURE ラインの後、prometheus/prometheus v3.15.0 をピン留めした。このピンでのデフォルト OSS は admin API、lifecycle HTTP、remote-write receiver、OTLP receiver が無効である。PopulateDiscoveredLabels はすべての http_sd グループラベルをコピーする。__unix_socket__ は __meta_* ではないため、メタデータワイプを生き残る。PopulateLabels は __address__ のみをチェックする。

func (sp *scrapePool) clientForTarget(t *Target) *http.Client {
	socketPath := t.labels.Get(UnixSocketLabel)
	if socketPath == "" {
		return sp.client
	}
	client, err := newUnixSocketScrapeClient(socketPath, ...)
func newUnixSocketScrapeClient(socketPath string, ...) (*http.Client, error) {
	optFuncs = append([]config_util.HTTPClientOption{config_util.WithDialContextFunc(
		func(ctx context.Context, _, _ string) (net.Conn, error) {
			return (&net.Dialer{}).DialContext(ctx, "unix", socketPath)
		},
	)}, optFuncs...)

CheckTargetAddress は依然として address 内の / を拒否する。URL() は __scheme__ / __address__ / __metrics_path__ から scheme/host/path を保持し、ソケットは dial 専用である。

既に記録済みの誤った道: SD が既に TCP ターゲットを選択するためこれをモデル内 NONE と採点すること (新しいプリミティブはホスト IPC である)、__address__ としての unix:///var/run/docker.sock を穴とみなすこと (それは拒否される)、デフォルトの example 設定がこの残存問題だと主張すること。茶番: リバースシェル。オラクルは SD JSON が指定したソケット上でのスクレイプヘルス up である。

ラボ

python3 prometheus-unix-socket-dial-Abraxas-Labs.py

または

cd lab
./run.sh

prom/prometheus:v3.15.0 は Python サイドカーと netns を共有する。サイドカーは 127.0.0.1:8080/targets.json で http_sd を、2 つの unix HTTP オラクル (ファイルシステム /sockets/oracle.sock と抽象 @prom-lab-oracle) を提供する。Prometheus は 127.0.0.1:19390 で公開される。Admin API と lifecycle は無効のままである。

SUCCESS prometheus-unix-socket-dial sd=http_sd fs-traversal=yes abstract=yes tcp-slash-rejected=yes how=sd-labels PROMETHEUS-UNIX-SOCKET-DIAL-WITNESS

IOC: scrapeUrl=http://localhost:1/fs-traversal と /abstract、両方ともヘルス up。TCP スラッシュはアクティブターゲットにならなかった。

修正

SD からの __unix_socket__ を Dial する前に、サニタイズされた絶対ファイルシステムパスであることを確認すること。空値、NUL、Linux 抽象 @ 名、相対パス、および filepath.Clean 後の .. を拒否すること。スクレイプ YAML からのプレフィックスの許可リストがより強固である。オペレータ設定由来でない限り PopulateDiscoveredLabels からラベルを削除することも SD インジェクションを塞ぐ。

参考資料

  • github.com/prometheus/prometheus タグ v3.15.0 (5241a27fe3c6983549fccc32f6e65917408c63cd)
  • scrape/scrape.go · scrape/target.go · config/config.go
  • UDS スクレイプ #18091
  • CWE-918 · CWE-22

ライセンス

GNU Affero GPL v3.0。LICENSE を参照。ループバックラボのみ。無保証。

ツールをダウンロード