flawopen.com/command-injection/Ruby

● CWE-918 · 緊急
セキュリティ研究 · FlawOpen

脆弱性の解説:Command Injection in Ruby

Learn how to fix Command Injection (CWE-78) in Ruby. Side-by-side vulnerable vs secure code examples for Open3.capture2() and system() array arguments.

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

オフィスのアシスタントに「report.pdf」という書類の印刷を頼む場面を想像してください。攻撃者が「report.pdf; whoami」というファイル名を渡すと、アシスタントはそのメモ全体をそのまま端末の窓口に提出してしまい、書類の印刷に加えて管理者バッジの読み取りまで実行してしまいます。

主要な概念と専門用語

Web Application Security
主要概念 (Web Application Security):Core architecture component affected by CWE-918.
CWE-918
主要概念 (CWE-918):Standard Common Weakness Enumeration classification for command-injection-ruby.
Defense-in-Depth
主要概念 (Defense-in-Depth):Multi-layered engineering verification and runtime boundary isolation.

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

Step 1

信頼できない入力の受信

アプリケーションがHTTPリクエストから診断用ホスト名やファイル名などの入力を直接受け取ります。

Step 2

シェルコマンド文字列の安全でない連結

バックエンドが引数リストを使わず、生文字列の結合によってシェルコマンドを構築します。

Step 3

コマンド区切り文字の挿入

攻撃者が ';' や '&&'、'|'、バッククォートなどのメタ文字(例: '127.0.0.1; id')を挿入して構文を脱出します。

Step 4

サブシェルでの実行とホスト侵害

OSシェルがWebサーバー権限で追加されたコマンドを実行し、任意のリモートコード実行に至ります。

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

✕ 脆弱な実装
# Backtick execution invokes /bin/sh
def fetch_git_log(branch)
  # Input: "main; whoami"
  `git log #{branch}`
end
✓ 堅牢化されたセキュアパッチ
# Multiple arguments to system/Open3 bypass the shell
require 'open3'

def fetch_git_log(branch)
  # branch is passed as an isolated argument to git
  stdout, stderr, status = Open3.capture3("git", "log", branch)
  stdout
end

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

References