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

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

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

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

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
codeql-buffer-overflow-variant — CVE-2020-8597 (pppd EAP) の合成 CWE-120 スタックバッファオーバーフローバリアント(CodeQL 静的解析のターゲット) | Kitploit
ツール/GitHubGitHub/anna-kravets/codeql-buffer-overflow-variant
静的分析静的コード分析 (SAST)脆弱性分析コード分析
GitHubanna-kravets/codeql-buffer-overflow-variant

codeql-buffer-overflow-variant

CVE-2020-8597 (pppd EAP) の合成 CWE-120 スタックバッファオーバーフローバリアント(CodeQL 静的解析のターゲット)

リポジトリを見る

人気

すべて見る →

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

すべてのツールを探索

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

すべてのツールを見る →
181ヶ月前未レビュー
共有

codeql-buffer-overflow-variant

pppd の関数名、呼び出し深度、ディスパッチ構造を一切共有しないプログラムにおいて、CVE-2020-8597 — pppd EAP の rhostname スタックバッファオーバーフロー (CWE-120) — のバグクラスを再現する、意図的に脆弱な約170行の C プログラム。CodeQL 静的解析ターゲットとして使用される。

目的は汎用性テストである。pppd のバグを捕捉するために書かれた CodeQL クエリは、編集なしでこのプログラムに対しても発火しなければならない。もし発火すれば、そのクエリは元のコードの形ではなくバグクラスを表現していることになる。

このプログラムは意図的に安全でなく、解析のみを目的として存在する。デプロイしないこと。これが模倣するバグは公開されている (CVE-2020-8597、2020年開示)。

バグクラス

攻撃者由来の長さが固定サイズのバッファにコピーされるが、その長さをバッファのサイズに関連付けるガードが存在しない。

いずれの場合も境界チェックは存在する — ただ、重要な2つの量を関連付けることに失敗しているだけである。これを間違える方法はちょうど2通りあり、このプログラムにはそれぞれ1つずつ含まれている:

  • 正しい値、誤った境界。 コピー長はチェックされるが、sizeof(dest) ではなく受信フレームに対してチェックされる。オーバーリードは防ぐが、オーバーライトには何もしない。(handle_hello)
  • 正しい境界、誤った値。 チェックは sizeof(dest) を名指しする — バッファ境界にそっくりに見える — が、コピー長として使用される変数とは別の変数を制約している。(handle_stat)

2つ目はより難しく、これこそが pppd の死んだ vallen >= len + sizeof(rhostname) チェックの正体である: 宛先サイズに言及しながら、コピー長ではない何かを制約している比較。「ここで何らかの比較が sizeof(dest) に言及しているか?」 とだけ問うクエリは、これによって黙らされる。

pppd との構造比較 (なぜこれが真のバリアントなのか)

pppd / CVE-2020-8597このプロジェクト
ソースPPP fd に対する read()UDP ソケットに対する recvfrom()
ディスパッチグローバルな struct protent *protocols[]、プロトコル番号による線形マッチファイルローカルな const struct frame_op ops[]、1バイトタグによる線形マッチ
シンクまでの深度get_input → (*input) → eap_input → eap_requestdispatch_frame → (*handle) → handle_hello
宛先char rhostname[256]char name[64]
誤ったガードvallen がパケット len で制約されるvlen がフレーム plen で制約される

どちらも、これを grep ではなくデータフローにしている唯一の性質を保っている: ソースとシンクの間の関数ポインタテーブルを介した間接呼び出しである。

ハンドラ行存在するチェック判定
handle_hello()シンクは :80vlen > plen - 2 — 正しい値、誤った境界発火しなければならない
handle_echo()コピーは :106vlen >= sizeof(buf) — 両方正しい沈黙を保たなければならない — ネガティブコントロール
handle_stat()シンクは :145hlen >= sizeof(report) — 正しい境界、誤った値発火しなければならない

handle_stat が判別ケースである。そのチェックは sizeof(report) を名指しするため、宛先サイズに言及するあらゆる比較を受け入れるクエリは、これをガード済みとみなしてバグを見逃す。これを捕捉するには、チェックされている値とコピー長として使用される値を比較する必要がある — グローバル値番号付けである。これをクエリから削除すると、このハンドラは偽陰性となり、他のすべてのサイトは判定を保つ。

ワイヤフォーマット

1つの UDP データグラム = 1つのフレーム:

[ type : 1 ] [ length : 2, big-endian ] [ value : length bytes ]

type 0x01 → hello、0x02 → echo、0x03 → stat。宣言された長さが65から約2045の間の hello フレームは name[64] をオーバーフローさせる。stat フレームは代わりに2つの1バイト長を運ぶ — ヘッダ長とボディ長 — そしてヘッダ長が何を言おうと、32を超えるボディ長は report[32] をオーバーフローさせる。

ビルド

make            # gcc -Wall -Wextra -O0 -g -o tlv_server tlv_server.c

Linux/POSIX (BSD ソケット)。警告なしでクリーンにビルドされる。

CodeQL データベースのビルド

CodeQL は実際のコンパイルをトレースするので、クリーンな状態からビルドする:

make clean
codeql database create db --language=cpp --command="make"
# or, without the clean step:
codeql database create db --language=cpp --command="make -B"

次に db に対して Part 3 クエリを実行する; handle_hello の memcpy と handle_stat の memcpy を報告し、handle_echo では沈黙を保つはずである。クエリとその実行手順は codeql/ にある。

ハンドラが追加されるたびにソースは変わるので、データベースを再ビルドすること — CodeQL は database create 時点のコードをスナップショットし、既存の db/ は新しいコードを見ない。

ツールをダウンロード