
CVE-2026-23491 - InvoicePlane のゲストコントローラーにおける未認証のパストラバーサル
| フィールド | 詳細 |
|---|---|
| CVE ID | CVE-2026-23491 |
| 深刻度 | 緊急 |
| アドバイザリ | アドバイザリを表示 |
| 発見者 | Lukasz Rybak |
InvoicePlane v1.6.3 の Guest モジュールの Get コントローラにおける get_file メソッドに、パストラバーサルの脆弱性が存在します。この脆弱性により、認証されていない攻撃者が入力ファイル名を操作してサーバー上の任意のファイルを読み取ることが可能になります。これにより、データベース認証情報を含む設定ファイルなどの機密情報が漏洩します。
脆弱性は application/modules/guest/controllers/Get.php ファイル内の get_file 関数にあります。
この関数は URL から直接 $filename パラメータを受け取ります。urldecode($filename) を実行しますが、ディレクトリトラバーサルシーケンス(例:../)に対する入力のサニタイズが行われていません。サニタイズされていないファイル名はベースディレクトリ($this->targetPath、これは uploads/customer_files/ にマッピングされます)と連結され、readfile() 関数に渡されます。
脆弱なコードスニペット:
public function get_file($filename): void
{
$filename = urldecode($filename);
if ( ! file_exists($this->targetPath . $filename)) {
$ref = isset($_SERVER['HTTP_REFERER']) ? ', Referer:' . $_SERVER['HTTP_REFERER'] : '';
$this->respond_message(404, 'upload_error_file_not_found', $this->targetPath . $filename . $ref);
}
// ... headers setting content type and disposition ...
readfile($this->targetPath . $filename);
}
$filename はユーザーが制御可能でチェックされていないため、攻撃者は ../../ipconfig.php のような文字列を指定して、意図されたディレクトリの外に脱出できます。
以下の cURL コマンドは、デフォルトの uploads/customer_files/ ディレクトリから2階層上の ipconfig.php ファイルを読み取る例を示しています。
curl http://localhost/index.php/guest/get/get_file/..%2f..%2fipconfig.php
期待される出力:
サーバーは ipconfig.php の内容を応答として返します。これには DB_PASSWORD や ENCRYPTION_KEY などの機密性の高い環境変数が含まれます。
攻撃者はアプリケーションの設定、ソースコード、およびウェブサーバーユーザーが読み取り可能なシステム上のその他のファイルを読み取ることができます。
本 CVE は、調整された脆弱性開示の慣行に従って責任を持って開示されました。ここに提供される情報は、教育および防御目的のみを意図しています。