速報

X.Orgのクライアントライブラリーで17件を修正!Linux端末と画像処理の利用範囲を点検

CATEGORY

コマンドインジェクションを防ぐ実装|シェルを外した後も確認する引数と権限

※本ページのリンクにはプロモーションが含まれています。

実行するプログラムと引数を分けて許可範囲を制限する黄土色背景の概念イラスト

目次

画像変換、PDF生成、圧縮、データの書き出し。Webアプリの裏で外部プログラムを動かす処理は珍しくありません。入力文字列をコマンドへ連結していると、利用者に渡すつもりのなかった実行の自由度まで与えるおそれがあります。

本記事は2026年10月18日にOWASPとNode.jsの一次資料を確認した実務解説です。特定の製品の新規脆弱性の速報ではありません。ファイル変換の例は仮想で、設計と試験の進め方は本サイトの提案です。AIエージェントにコマンドを承認する問題とは分け、Webアプリ自身が外部入力を処理する境界を扱います。

スポンサーリンク

最初の選択はOSコマンドを呼ぶ必要があるか

OWASPは、直接OSコマンドを呼ばず、目的に対応するライブラリのAPIを使うことを第一の対策として挙げています。ファイル操作や単純な変換のために、文字列でコマンドを組み立てていないかを調べます。外部実行をなくせれば、シェルの構文を解釈する境界を減らせます。

ただし、ライブラリへ置き換えれば入力検証や更新管理が不要になるわけではありません。取り込んだファイルを解析する処理には別の脆弱性や負荷の問題が残り得ます。呼び出す層を減らすことと、その処理全体が安全であることは分けます。

外部プログラムが必要なら、どの機能のために使うのか、受け付ける入力と出力は何か、どの利用者が起動できるのかを先に決めます。任意のコマンドを受け取る汎用の実行APIを作るより、業務上必要な操作を固定した入口へ分ける方法を検討します。

出典:OWASP OS Command Injection Defense Cheat Sheet。

実行ファイルと引数を分離する

シェルへ一つの文字列を渡す方式では、シェルが持つ構文を考える必要があります。実行するプログラムを固定し、引数を配列などで別に渡すAPIを使うと、この経路を減らせる場合があります。利用する言語とOSの公式仕様を確認してください。

Node.jsの公式資料は、execがシェルを使うことと、execFileが既定では直接プログラムを起動することを説明しています。オプションでshellを有効にする場合など、採用した呼び出し方を確認する必要があります。API名だけで判断せず、実際に有効な設定を見ます。

OSによって起動できるファイルやスクリプトの扱いは異なります。開発PCで動いた短いサンプルを、そのままLinuxやWindowsの本番へ移さないようにします。実行ファイルの解決方法、作業ディレクトリ、権限を環境ごとに検証します。

スポンサーリンク

シェルを外しても引数の意味は変えられる

OWASPは引数インジェクションも説明しています。入力が別のコマンドを起動しなくても、呼び出したプログラムにとって意味のあるオプションとして扱われれば、出力先や設定、通信先などを変えられる場合があります。

本サイトは、利用者に指定させる値を用途ごとに分類し、形式と選択肢を制限することを勧めます。変換形式は既知のキーから固定の引数へ対応させ、入力の文字列をそのままオプションの列として受け取らないようにします。

オプション終端の記法を使えるプログラムもありますが、すべてのプログラムへ共通に適用できる保証はありません。採用する実行ファイルの仕様に従います。安全そうな特殊文字を削除する処理だけでは、プログラムごとの意味を十分に制限できません。

パスと実行環境も入力の一部として扱う

利用者が指定したファイル名を、そのまま任意の保存パスへ使わないようにします。アップロード時に決めた内部IDから管理下のファイルへ対応させ、作業用の領域と出力先を限定します。名前が正しい形式でも、他人のファイルを指してよいわけではありません。

実行するプログラムの場所も固定し、意図しない実行ファイルが先に見つかる構成を避けます。PATHや設定ファイルの検索先、作業ディレクトリを調べ、書き込み可能な領域からコードや設定を読み込まないようにします。

子プロセスへ環境変数をすべて渡す必要があるかも確認します。Webアプリが持つDB接続情報やクラウドの資格情報を、単なる変換プログラムへ共有しない設計を検討します。設定を減らすときは必要な動作を測り、動かないからと高権限の環境全体を渡し直さないことが重要です。

関連する公式仕様:Node.js Child process公式ドキュメント。

スポンサーリンク

実行権限と通信先で影響の範囲を狭める

コマンドの構文が安全でも、解析するファイルや実行プログラム自体に問題がある場合があります。必要なファイルだけを読める低い権限で実行し、本番データや認証情報へ不要に届かない構成を用意します。

外部への通信が必要ない変換なら、通信を許さない実行環境を検討します。ネットワークへ接続する処理が必要なら、宛先や取得する情報の扱いを別に設計します。入力で任意のURLを与えられる構成は、コマンド注入とは別にSSRFなどの検討も必要です。

コンテナを使う場合も、ホストの重要な領域や高権限の操作口を渡していれば、分離の効果は変わります。コンテナで動くという名前だけではなく、見えるファイル、与えた資格情報、許可した操作を確認します。

時間・同時実行・出力量に上限を設ける

外部プログラムが止まらない、出力が大きい、子プロセスを残すといった失敗も運用の問題です。タイムアウトだけでなく、同時実行数、入力の量、出力ファイルの大きさ、標準出力と標準エラーの量を用途に沿って管理します。

Node.jsの子プロセスAPIでは、出力の扱いと上限などを公式仕様で確認できます。バッファーにまとめて受けるか、ストリームで処理するかでも設計は変わります。小さなテストファイルで動いたことを、最大入力でも安全に動く証拠にしないでください。

処理を中断したときに、起動した子プロセスや一時ファイルが残らないかを試します。失敗した結果を成功扱いで配布せず、再試行で同じ作業が無制限に増えないようにします。上限は一律の数字ではなく、通常の業務データと実機で測って決めます。

変換ジョブを題材にしたレビュー手順

仮想のPDF生成ジョブなら、利用者は形式の選択と元データのIDだけを指定し、実行ファイル、オプション、作業先はサーバーが決める構成を考えます。ジョブを受け付ける時点で対象の権限を確認し、実行時にも必要な状態が維持されているかを確認します。

試験では、通常の日本語を含む名前、空白、長い名前、無効な形式、想定外のオプションに見える値を与えます。正当な入力を壊さず、不明な指定を拒否できることを確かめます。危険な命令を本番へ送って検査する必要はありません。

出力先へ期待したファイルだけができ、他の領域が変わらず、秘密がログへ残らないことを確認します。失敗時には出力物を利用者から見える完成品へ昇格させず、後片付けと結果の案内を行います。

境界設計する条件試験する結果
実行ファイル業務で使うものを固定する入力で別プログラムを選べない
引数用途ごとの許可値を渡す不明なオプションを拒否する
ファイル管理下のIDから解決する別利用者や管理領域へ届かない
資源時間・量・並行数を制御する中断後に処理と一時物が残らない

改修は汎用の実行口を狭めるところから

最初に、外部入力を含むコマンド文字列を作る箇所を一覧にします。管理画面、バッチ、予約実行も対象です。次に、ライブラリへ置き換えられる処理を分離し、残った実行は操作別の小さな関数へまとめます。

共通関数へコマンドの断片を自由に渡す方式では、危険な自由度を隠しただけになる場合があります。関数の引数を業務上の値へ限定し、内部で固定の実行手順へ変換します。何を実行してよいかをコードレビューで説明できることが基準です。

生成AIが書いたコードや過去のサンプルでも、同じ確認を行います。エスケープ関数を見つけたという理由だけで合格にせず、シェル、引数、実行環境、権限、失敗時の状態を順に追います。

スポンサーリンク

再試行は実行回数を増やす変更として確認する

仮想の変換APIで、応答が遅いときに利用者の画面とキューの両方が再試行すると、一つの依頼から複数のプロセスが動く場合があります。注入を防いでいても、これが処理の過剰実行や出力の競合につながります。依頼を識別し、同じ処理をどこまで繰り返すかを仕様にします。

途中までできた出力を再利用するなら、それが同じ入力と設定から作られたものかを確認します。失敗したファイルを次の試行が完成品として拾わないよう、作業中の保存先と配布する保存先を分ける方法を検討します。

監視では、起動数、完了数、中断数、残った作業を対応付けます。コマンド全文や入力ファイルの内容を記録することより、秘密を含まないジョブIDで処理の流れを追えることが重要です。

実行プログラムの更新も運用へ組み込む

アプリの依存関係を更新しても、OS側の変換プログラムやコンテナに含まれた古い実行ファイルは残ることがあります。実際に動くプログラムの版と配置元を把握し、更新担当と検証対象を定めます。

更新後には、同じ引数が同じ意味を持つか、出力形式や失敗時の挙動が変わっていないかを試します。新しいオプションが増えた場合も、利用者へ自由に使わせる設定へ変えず、必要な機能だけを選びます。

安全な外部実行は、特殊文字の一覧を覚える作業ではありません。渡す自由度を必要なものへ絞り、処理が想定を外れても影響を広げず、成功と失敗を検証できるようにする設計です。

スポンサーリンク

参考資料

以下は2026年10月18日に直接確認した一次資料です。製品やサービスの設定は、実際に利用する版と環境に対応する資料で確認してください。

この記事を書いた人

Ryohei

Webエンジニア / アプリ開発者 / 技術ブログ運営者

福岡のWeb制作会社に勤務するWebエンジニアです。10年以上にわたりWeb制作・開発に携わり、これまでに100以上のWordPressサイトの構築・保守を担当してきました。Webサイト制作に加え、アプリ開発やAIを活用した開発にも取り組み、近年はWebセキュリティにも注力しています。

2015年から技術メディア「Into the Program」を運営し、実務や開発で得た知識をもとに、プログラミングの実装方法やWebサイトの運用・セキュリティ情報を発信しています。

主な分野
WordPress / PHP / JavaScript / アプリ開発 / Webサイトの運用・セキュリティ対策
資格・試験合格
情報セキュリティマネジメント試験
基本情報技術者試験
AWS認定ソリューションアーキテクト アソシエイト
メディア運営
2015年〜

記事の作成・更新について

セキュリティ記事は、ベンダーの公式アドバイザリやCVE・JVNなどの一次情報を参照し、出典と情報確認日を記載します。実環境での検証を行った場合は、その環境と確認範囲を明示します。重要な追加情報や誤りを把握した場合は、内容を確認して追記・訂正します。

スポンサーリンク

関連する記事

おすすめの書籍