FlawOpen

flawopen.com/Teardowns/cve-2015-3306-proftpd-mod-copy-unauthenticated-file-copy

● CVE-2015-3306 · CVSS 10.0 · 緊急
セキュリティ研究 · FlawOpen

CVE-2015-3306:ProFTPD mod_copyの未認証ファイルコピー

CVE-2015-3306では、未認証のクライアントがProFTPD mod_copyのコマンドを使ってサーバー上のファイルをコピーできました。上流修正はSITE CPFRとSITE CPTOの両ハンドラーで認証状態を確認します。CISAは2026-10-08に本件をKEVへ追加しました。 2026年10月8日公開のFBI、CISA、NSAなどの共同勧告は、CVE-2015-3306をMicroScanのスクリプトから確認された悪用成功CVEの一覧に含めています。このCVEについて、個別の被害者やインシデントの日付は示していません。[1], [2], [5], [6]

💡 わかりやすい解説 (ELI5)

書庫の担当者が、誰からでも「このファイルを複製して」「コピーをここに置いて」という依頼を受ける状況を想像してください。片方だけを確認しても不十分です。コピー元とコピー先の両方の処理を、認証済みセッションに結び付ける必要があります。[3]

主要な概念と専門用語

SITE CPFR / SITE CPTO
サーバー側コピーのコピー元とコピー先を指定するProFTPD mod_copyのコマンド。[3], [5]
mod_copy
サーバー側のファイルコピーコマンドを提供するProFTPDの任意モジュール。[3], [5]
CWE-284
不適切なアクセス制御。必要な認可を満たさずに保護対象の操作へ到達できる弱点。[1]

フレームワーク対応

根本原因の分析 (Root Cause)

影響を受けるProFTPD 1.3.5の構成でmod_copyが利用可能かつ有効な場合、copy_cpfr()とcopy_cpto()は、セッション認証を要求せずにSITE CPFR/SITE CPTOの処理を受け付けていました。上流PR #109は、基本的なコマンド振り分けチェックの後、最小引数数の検証、コピー元/コピー先パスの処理、およびコピー操作の前に両ハンドラーで認証状態を確認する処理を追加し、未認証ならFTP 530 / EPERMを返します。モジュールの操作範囲はProFTPDプロセスのOS権限に制限されるため、ファイルへの影響はその権限と構成によって異なります。Debianは任意コード実行を自動的な結果ではなく「可能性」として記載しています。コードとして処理される書き込み可能なパスなど、構成固有の追加条件が必要です。[3], [5], [4]

運用マトリクス:露出条件と修正済みパッケージの確認

デプロイ状態情報源で確認できる内容防御側の対応
ProFTPD 1.3.5 で mod_copy が利用可能かつ有効Ubuntu の記録は SITE CPFR と SITE CPTO によるリモートのファイル読み書きを説明し、NVD は ProFTPD 1.3.5 を影響対象として掲載しています。正確なパッケージビルド、モジュールのロード状態、コマンドの公開状態を確認し、ディストリビューションの修正版へ更新してください。
upstream 修正:PR #109 / commit 35b65aaこのパッチはコピー処理の前に copy_cpfr() と copy_cpto() の両方へ認証チェックを追加します。両コマンドが未認証セッションを拒否することを確認し、ファイルシステム権限は別の境界として扱ってください。
Debian wheezy / jessie / stretch / sidDebian は各系列をそれぞれ 1.3.4a-5+deb7u3、1.3.5-1.1+deb8u1、1.3.5-2 で修正しました。インストール済み Debian パッケージのリビジョンを該当する修正版と照合し、upstream のバージョン番号だけに頼らないでください。
CopyEngine off のサポートPR #109 でこのディレクティブが追加され、モジュール文書は 1.3.6rc1 以降の互換性を示しています。導入版が対応し機能が不要なら CopyEngine off を使い、それ以外はモジュールを外すか更新してください。

ステップ・バイ・ステップの攻撃フロー

ステップ 1

未認証セッションからmod_copyへ到達

対象モジュールが存在し、コピーコマンドが公開されている場合に影響します。[5], [1]

ステップ 2

コピーコマンドに認証確認がない

修正前は、セッションの認証状態を確認せずCPFRとCPTOを続行できました。[3]

ステップ 3

コピー範囲はサーバーの権限内

サービスアカウントがアクセスできるファイルが漏えいまたは変更される可能性があります。コード実行には追加条件が必要です。[5], [4]

ステップ 4

修正が両方の操作を保護

上流変更は各ハンドラーでコピー処理より前に認証エラーを返します。[3]

ソースコード比較:脆弱 vs 堅牢化

脆弱な抜粋ではcopy_cpfr()に認証確認がありません。修正版は引数検証や状態変更の前に、上流のセッション状態確認を挿入します。PR #109はcopy_cpto()にも同じ保護を追加しています。単独で動作するプログラムではなく、ソースコードの抜粋です。[3]

脆弱な実装
/* 上流 PR #109 適用前の copy_cpfr() の抜粋。 */
if (cmd->argc < 3 ||
    strncasecmp(cmd->argv[1], "CPFR", 5) != 0) {
    return PR_DECLINED(cmd);
}
CHECK_CMD_MIN_ARGS(cmd, 3);
/* 認証確認なしでソースパスの処理が続行される。 */
堅牢化されたセキュアパッチ
/* copy_cpfr() の上流修正(PR #109)の抜粋。 */
unsigned char *authenticated = NULL;
if (cmd->argc < 3 ||
    strncasecmp(cmd->argv[1], "CPFR", 5) != 0) {
    return PR_DECLINED(cmd);
}
authenticated = get_param_ptr(cmd->server->conf, "authenticated", FALSE);
if (authenticated == NULL || *authenticated == FALSE) {
    pr_response_add_err(R_530, _("Please login with USER and PASS"));
    pr_cmd_set_errno(cmd, EPERM);
    errno = EPERM;
    return PR_ERROR(cmd);
}
CHECK_CMD_MIN_ARGS(cmd, 3);

エンジニアリング&システム堅牢化チェックリスト

参考資料