
OliveTinは、事前定義されたシェルコマンドをエンドユーザーに公開するためのセルフホスト型Web UIです。このリポジトリには、OliveTinのシェルモード実行パスにおける2つの独立したOSコマンドインジェクションベクターを実証する概念実証が含まれており、どちらもアプリケーションの意図するシェル引数安全性チェックをバイパスします。
| CVE ID | CVE-2026-27626 |
| コンポーネント | OliveTin |
| 脆弱性クラス | CWE-78: Improper Neutralization of Special Elements used in an OS Command |
| CVSS 3.1 | 9.9–10.0 (Critical) — AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H |
| 影響を受けるバージョン | All versions ≤ 3000.10.0 (commits prior to 0.0.0-20260222101908-4bbd2eab1532) |
| 修正バージョン | 0.0.0-20260222101908-4bbd2eab1532 以降 |
| アドバイザリ | GHSA-49gm-hh7w-wfvf |
| 公開日 | 2026-02-22 (advisory), 2026-02-25 (NVD) |
OliveTinは、定義済みのシェルコマンドをエンドユーザーに公開する自己ホスト型Web UIです。このリポジトリには、OliveTinのShellモード実行パスにおける2つの独立したOSコマンドインジェクションベクターを実証する概念実証コードが含まれています。どちらもアプリケーションが意図するシェル引数の安全性チェックを回避します。
OliveTinでは、管理者がアクション(パラメーター化された引数を持つシェルコマンド)を定義できます。認証された(あるいは設定に応じて匿名の)ユーザーは、Web UIまたはWebhookを介してそのアクションをトリガーできます。ユーザーが引数値を介して意図されたコマンドから逸脱するのを防ぐため、OliveTinはすべてのユーザー指定引数をcheckShellArgumentSafety()に通してから、コマンド文字列にテンプレート化し、sh -cに渡します。
これが脆弱性の破るセキュリティ境界です。OliveTinは「管理者がコマンドを定義する」と「ユーザーが値を提供する」を明確に区別しており、安全性チェックは特にユーザーが引数値を利用して任意のコマンドを実行できないようにするために存在します。
password 引数型がチェックされないcheckShellArgumentSafety()は、固定された許可リストの引数型のみをサニタイズします。
func checkShellArgumentSafety(argType string, value string) bool {
dangerousTypes := []string{"string", "int", "bool", "choice"}
for _, dt := range dangerousTypes {
if argType == dt {
return sanitizeInput(value)
}
}
// BUG: "password" type not checked
return true // Assumes safe
}
passwordは、機密性の高いユーザー入力を受け付けるための文書化された意図された引数型ですが、dangerousTypesに含まれていないため、チェックされずにreturn trueにフォールスルーします。Shellモードのアクションでpassword型の引数を設定できるユーザーは、シェルのメタ文字(;、|、`、$()など)を注入して、OliveTinプロセスユーザーとして任意のコマンドを実行できます。
ここでの悪用可能性はOliveTinのデフォルト設定によって増幅されます。自己登録が有効で、authType: noneが標準設定であるため、多くの実際のデプロイメントでは「認証済みユーザー」に実質的な障壁が存在しません。
Vector 1とは独立して、OliveTinのWebhookハンドラーは受信WebhookのJSON本文から任意のキー/値ペアを抽出し、それらを直接ExecutionRequest.Argumentsに注入します(service/internal/executor/handler.go:153-157)。
これらのWebhook由来のキーには、アクションの設定に対応するActionArgumentが定義されていないため、parseActionArguments()(arguments.go)はチェック対象の引数型を見つけられず、checkShellArgumentSafety()を完全にスキップします — passwordに限らず、すべての型でスキップされます。生の値がシェルコマンドにテンプレート化され、検証ゼロでsh -cに渡されます。
受信Webhookを外部/信頼できないソースから受け取ることはOliveTinの主要なユースケースの1つであるため、このベクターはまったく認証を必要としません。
Shellモードで実行され、Webhookトリガー可能なアクションがあるOliveTinインスタンスは、認証なしのリモートコード実行に対して脆弱であり、OliveTinプロセスの権限で実行されます。OliveTinのデプロイ方法(ベアメタル vs. コンテナ、付与されたケイパビリティなど)によっては、ホスト全体が危険にさらされる可能性があります。
以下の条件に該当する場合、脆弱である可能性があります。
password型の引数があり、それが信頼できない/低権限のユーザーに公開されている(ベクター1)、またはpython3 CVE-2026-27626.py -u <TARGET> [OPTIONS]
0.0.0-20260222101908-4bbd2eab1532以降にアップグレードしてください。password型の引数を削除するか、使用を避けてください。authTypeをnone以外に設定)。| 日付 | イベント |
|---|---|
| 2026-02-20 | CVE予約 |
| 2026-02-22 | GitHubセキュリティアドバイザリ公開 |
| 2026-02-25 | NVD公開 |
| 2026-02-27 | アドバイザリ更新 |
このPoCは、防御研究、検出エンジニアリング、および許可された侵入テスト目的でのみ公開されています。所有していないシステム、または明示的な書面によるテスト許可がないシステムに対して実行しないでください。このコードを第三者システムに対して悪用すると、コンピュータ犯罪法(米国のCFAA、英国のComputer Misuse Act、その他の同等の法律)に違反する可能性があり、その責任はすべて実行者の負うものとします。
Md Saikat (0xh7ml)
| オプション | 説明 | デフォルト |
|---|
-u, --url | ターゲットホスト/IP | 必須 |
-p, --port | OliveTinポート | 1337 |
-x, --cmd | 実行するコマンド | id |