この記事についてClaude(Anthropic)との共同編集により作成されました。
要約
- Helpfeel の公式発表は、脆弱性の CWE 名を「OSコマンドインジェクション」とは明言していない。確認できるのは「画像アップロードサーバーの脆弱性を悪用し、任意のコマンドを実行された」という結果(遠隔での任意コマンド実行)である1
- 任意コマンド実行を生む欠陥は複数ある。そのうち、Web アプリ、特に画像処理パイプラインで長年くり返されているのが OSコマンドインジェクション(CWE-78)である。CWE Top 25(2024)では 7 位、実際に悪用された脆弱性(CISA KEV)ベースではさらに上位に来るクラスである23
- 本質は SQL インジェクションと同じで、「値のつもりで渡した文字列が、シェルにとって命令になる」ことである。対策の本丸はエスケープではなく、OSコマンドを呼ばない/呼ぶならシェルを介さず引数を分離することである456
- コマンド実行が取れると、そのプロセスの権限でファイル操作・設定窃取・他ホストへの踏み台が可能になる。Gyazo ではその先にデータベースアクセスと、ユーザー関連データ約 2,362 万件・画像メタデータ約 4.9 億件の持ち出しが続いた1。入口の修正だけでは足りず、権限・ネットワーク・秘密情報の隔離が被害規模を決める
- 画像アップロードサーバーで「コマンドが打てる」経路は一つではない。(A) アプリがファイル名・変換オプションをシェル文字列に連結する、(B) ファイル名が外部コマンドのオプションとして解釈される(引数インジェクション)、(C) ImageMagick 等の変換エンジンがファイル中身を見て delegate 経由でシェルを呼ぶ、の三層がある。OWASP はアップロード画像のリサイズ処理がライブラリ欠陥(ImageTragick 等)を起動しうると明記している14
はじめに
2026年9月、画像共有サービス Gyazo で「画像アップロードサーバーの脆弱性を悪用した任意コマンド実行」から大規模な情報漏えいが起きた。この記事は、この公表内容を入口に、OSコマンドインジェクション(CWE-78)がどういう欠陥なのか、成立すると何が起きうるのか、どう防ぐのかを公式資料ベースで整理する。
先に断っておくと、Gyazo の脆弱性が OSコマンドインジェクションだったと公式が言っているわけではない。公式が出しているのは「任意のコマンドを実行された」という結果までで、弱点クラスは非公表である。それでも、画像アップロードサーバーで任意コマンド実行に至る典型原因はこのクラスなので、自分のサービスの同じ形を点検する材料として深掘りする。攻撃手順や再現用ペイロードは書かない。防御と概念の整理だけである。
きっかけ:Gyazo 情報漏えい(2026年9月)
株式会社 Helpfeel は 2026年9月16日、「Gyazo」への不正アクセスによる情報漏えいを公表した。2026年9月16日時点の公式説明は次のとおりである1。
| 項目 | 公表内容(2026-09-16 時点) |
|---|---|
| 発生 | 2026-09-11。画像アップロードサーバーの脆弱性を悪用し、第三者がシステム上で任意のコマンドを実行 |
| 検知・遮断 | 同日夜に不正な挙動を検知。9月12日未明までに侵入経路の遮断と不正接続の切断。原因脆弱性の修正も同日完了 |
| 流出確認 | 9月14日。第三者がデータベースにアクセスし、ユーザー情報と画像メタデータが外部流出 |
| ユーザー関連データ | 約 2,362 万件(メール未登録の匿名アカウントを含む。実人数は調査中) |
| 画像メタデータ | 主に 2019年1月以前の約 4.9 億件(画像データ全体の約 14.4%)+条件を絞って取得された約 240 万件 |
| 含まれた情報の例 | 名前/ニックネーム、メール、パスワードのハッシュ、利用者ID、端末ID、ログインセッションID、X 連携トークン、Google SSO メール、画像ID(URL を構成する情報)、アップロード元 IP、EXIF 位置情報、OCR テキスト、非公開画像のパスフレーズ(ハッシュ)など |
| 流出していないもの | クレジットカード番号等の決済情報。画像ファイル自体の消失も未確認 |
| 他サービス | Helpfeel / Cosense からの流出は未確認(Gyazo とは別システム構成) |
メタデータに画像 URL を構成する情報が含まれていたため、流出情報から対象画像へ不正アクセスできる恐れがある。Helpfeel は二次被害防止として一部画像の閲覧を一時無効化した。非公開画像のファイル一覧取得も確認されており、一部が閲覧された可能性は完全には否定できないとしている1。
再発防止として公式が挙げているのは、認証・認可およびアクセス制御の見直し、監視・監査の強化、安全な設計・開発・レビュー体制の整備である1。フォレンジック調査は継続中で、件数・影響範囲は今後更新されうる。
なお 2026年9月18日には、Helpfeel / Cosense への影響に関する続報が出ている。両サービスは Gyazo と別システムで運用されており流出・侵入の痕跡は未確認、予防措置として全社的な緊急セキュリティ点検を実施中、という内容で、件数や脆弱性の種類に関する更新はない22。
公式発表から言えること/言えないこと
言えること
- 入口は画像アップロードサーバーだった。
- 攻撃者はホスト上で任意のコマンドを実行できた(いわゆる遠隔コード実行に相当する結果)。
- その後、データベースへ到達し大量のメタデータを持ち出した。
- パスワードそのものではなくハッシュ、決済情報は別系統、という分離は一部機能していた。
言えないこと
- 脆弱性が CWE-78(OSコマンドインジェクション)だったのか、デシリアライゼーション、テンプレートインジェクション、危険なファイルアップロード、依存ライブラリの RCE など別経路だったのかは、公式には特定されていない。
- どの言語・どの外部コマンド(画像変換ツール等)が関与したかも非公表である。
したがってこの記事では、Gyazo を「アップロードサーバー上の任意コマンド実行が、DB 全件規模の漏えいに直結しうる実例」として扱い、その典型原因である OSコマンドインジェクションを深掘りする。脆弱性クラスを Gyazo 事件に断定はしない。
どういう脆弱性なのか
定義
CWE-78 の定義は次のとおりである2。
製品が、上流から来た外部入力を使って OS コマンドの全部または一部を組み立てるが、意図したコマンドを改変しうる特殊文字を正しく無効化(neutralize)しない。
IPA は、外部からの攻撃により Web サーバの OS コマンドを不正実行されてしまう問題を「OSコマンド・インジェクションの脆弱性」、その悪用を「OSコマンド・インジェクション攻撃」と呼ぶ4。OWASP は、フォーム・Cookie・HTTP ヘッダなど信頼できない入力をシステムシェルへ渡すときに成立し、実行権限は脆弱なアプリケーション自身の権限になると説明している7。
別名として shell injection も使われる2。OWASP Top 10:2025 では A05 Injection に含まれ、SQL・NoSQL・OS command・LDAP・式言語などが同じ「インタプリタにデータと命令が混ざる」問題として扱われる8。
CWE Top 25(2024)では CWE-78 は 7 位。発生件数そのものより、CISA の Known Exploited Vulnerabilities(KEV)に載った CVE 数では Top 25 中 3 位と、実害に繋がりやすいクラスである39。
何が壊れているのか(データと命令の混同)
アプリケーションは「ホスト名」「ファイル名」といった値を渡したつもりでも、シェルから見れば渡されたテキストはコマンドラインの一部である。シェルにとって意味のある記号(コマンド区切り、パイプ、リダイレクト、コマンド置換など)が混ざると、値ではなく構文として解釈される。
SQL インジェクションが引用符や OR でクエリ構造を変えるのと同じ構図である。違うのはインタプリタがデータベースではなく OS のシェルである点だけである8。
CWE は少なくとも 2 つの亜種を区別する2。
- 固定プログラム+引数注入 アプリは決まったコマンド(例: 名前解決、画像変換)だけを呼ぶつもりで、ユーザー入力をその引数にする。攻撃者はそのプログラムの実行自体は止められないが、コマンド区切りを引数に混ぜて後ろに別コマンドを足せる。
- 実行するプログラム自体を入力で選ぶ 入力がコマンドライン全体になり、呼び出すバイナリごと攻撃者に渡る。
前者の方が「普通の機能実装」で起きやすく、画像アップロード・プレビュー生成・動画変換・PDF 変換・Ping 診断・メール送信ラッパなどに現れやすい。
関連する別クラス(混同しやすいもの)
| クラス | ID | 違い |
|---|---|---|
| Command Injection(広義) | CWE-77 | OS シェル以外の「コマンド言語」も含む親クラス。OS コマンドを指すつもりで 77 が誤用されることが多い10 |
| OS Command Injection | CWE-78 | この記事の対象。シェル経由で OS コマンドの構造が変わる |
| Argument Injection | CWE-88 | シェルを介さず引数を配列渡ししても、追加のオプション(先頭が - の引数など)をねじ込まれる。OWASP は「OSコマンドインジェクションは同時に引数インジェクションでもある」と整理する5 |
| Code Injection | CWE-94 | アプリ自身の言語でコードを評価させる(eval 等)。コマンドインジェクションは既存の OS 機能を拡張する点が異なる7 |
「任意のコマンドが動いた」だけでは CWE-78 と断定できない。デシリアライゼーション(CWE-502)や危険なファイル種別のアップロード(CWE-434)でも同じ結果になりうる。Gyazo 公式がクラス名を出していない理由は、この切り分けが調査中だから、という理解が妥当である。
なぜアップロードサーバーで起きやすいか
IPA は「外部プログラムを呼び出し可能な関数を使っている Web アプリケーション」全般を注意対象とし、Perl / PHP の system / exec / open などを例示している4。画像共有サービスでは、次のような実装がコマンド呼び出しと外部入力を近づけやすい。
- アップロード直後に ImageMagick / GraphicsMagick / ffmpeg / Exif 解析ツール / OCR などを子プロセスとして起動する。
- ファイル名、拡張子、変換オプション、出力パスを文字列連結でコマンドラインに載せる。
- 「シェルのパイプやリダイレクトが便利」なので、言語の
system()やshell=True相当で一行の文字列を渡す。
CISA と FBI は、OSコマンドインジェクションは「ユーザー入力とコマンド内容を分離すれば防げる、長年知られた欠陥」であるにもかかわらず、ネットワーク機器等で実害が続いているとして Secure by Design Alert を出している6。Web のアップロード処理も、同じ「文字列でコマンドを組む」失敗をする。経路の内訳は次節。
言語側で特に危険とされるのは、コマンドプロセッサ(シェル)を起動する APIである。
- C / POSIX:
system(),popen()(CERT はsystem()の不使用を原則とする)11 - PHP:
system(),exec(),passthru(),shell_exec(),popen()4 - Perl:
open(),system(),eval()等4 - Python:
os.system()、subprocessのshell=True、文字列一本で渡す実行 - Java: 文字列連結したコマンドを
Runtime.execに渡す(ただし Java のRuntime.execは C のsystem()と違いシェルを起動しない。区切り記号による連結は効かない一方、引数インジェクションやcmd /cの明示呼び出しは別問題)57
画像アップロードサーバーで起きうる「コマンドが打てる」経路
アップロード処理でコマンド実行に至る道は、よく一つの「OSコマンドインジェクション」にまとめられるが、入力の入口とシェルを呼ぶ主体が違う。Gyazo が扱うスクリーンショット・GIF・動画・OCR・取得元 URL は、いずれも下表のどこかに載りうる1。Gyazo でどれが使われたかは非公表である。
[ブラウザ] │ ファイル本体 / ファイル名 / 変換オプション / 取得 URL ▼[受信 API] ──(A) アプリがコマンド文字列を組む──► シェル ──► convert / ffmpeg / tesseract / wget │ │ 保存パスを引数配列で渡しても ├──(B) ファイル名が「オプション」になる (CWE-88) │ ▼[変換エンジン] ──(C) ファイル中身が delegate を起動──► ImageMagick が system() で wget/gs 等 │ └──(隣接) 実行可能ファイルの保存、パーサのメモリ破壊 RCE(インジェクションではない)(A) アプリが組むコマンドライン(古典的 CWE-78)
アプリが「このファイルをリサイズする」「OCR する」「元 URL から取る」ために、外部ツールを一行のシェルコマンドとして組む。外部入力は HTTP パラメータだけではなく、アップロードされたファイル名そのものが入力である。
OWASP のファイルアップロード対策は、ファイル名をアプリが生成した乱数(UUID 等)に付け替えること、先頭のハイフンを制限することを求める。後者は「シェルスクリプトで処理するとき」の安全策として明示されている15。
実害の近い例として、CodeIgniter 4 の ImageMagick ハンドラ(CVE-2025-54418 / GHSA-9952-gv64-x94c、4.6.2 未満)がある。ユーザー制御のファイル名のまま resize() する、またはユーザー制御の文字列で text()(画像への文字入れ)すると、シェルの特殊文字が ImageMagick 起動コマンドに混ざる。公式の回避策は GD に切り替える、保存時にランダムファイル名にする、文字入れなら許可文字だけ残す、である16。
同じ形は自前コードでも起きる。
| パイプラインの段 | よく呼ばれる外部コマンド | コマンドに混ざりやすい入力 |
|---|---|---|
| サムネイル・形式変換 | ImageMagick convert / magick、GraphicsMagick | 元パス、出力パス、サイズ指定 |
| GIF・動画 | ffmpeg | 入出力パス、コーデック、切り出し秒 |
| EXIF / IPTC | exiftool、identify | ファイルパス |
| OCR | tesseract 等 | ファイルパス、言語フラグ(Gyazo 流出項目に OCR テキストがある1) |
| 遠隔取得 | wget / curl | ユーザー指定の取得元 URL(Gyazo メタデータに取得元 URL がある1) |
| 透かし・キャプション | convert -annotate 等 | ユーザーが付けたタイトル・コメント |
防御は対策の章と同じで、ツールをライブラリ呼び出しに置き換えるか、どうしても呼ぶなら実行ファイルとフラグを定数、パスは自前で付けた安全な名前だけを引数配列で渡す。オリジナルのファイル名は DB の表示用に保存し、ディスク上の名前には使わない1516。
(B) ファイル名がオプションになる(CWE-88)
シェルを介さず subprocess.run(["ffmpeg", in_path, out_path]) としても、in_path が - で始まると多くの CLI はそれをスイッチと解釈する。OWASP がファイル名の先頭ハイフンを制限するのはこのためでもある15。影響は「ヘルプが出る」程度から、ツールによってはファイル読み・書き・別機能の起動まで幅がある5。対策はパスを絶対パスにする、オプション終端 -- を置く、ディスク上の名前を自分で付ける、の併用である。
(C) 変換エンジンがファイル中身を見てシェルを呼ぶ(delegate 型)
ここがアップロード特有で、(A) を直しても残る。アプリは「JPEG を渡せばリサイズされる」つもりでも、ImageMagick は多数の形式を delegate(外部プログラムへの委譲)で処理する。delegate は設定ファイル delegates.xml のコマンド文字列を system() で実行する実装だった。ファイル名やファイル内に埋め込まれた参照のフィルタが不足すると、画像を開くだけで OS コマンドが走る1718。
このクラスの代表が ImageTragick(CVE-2016-3714)である。NVD は、EPHEMERAL / HTTPS / MVG / MSL / TEXT / SHOW / WIN / PLT といった coder が、細工された画像中のシェルメタ文字により任意コード実行を許すと要約している19。CERT/CC VU#250519 と JPCERT/CC も、典型的な被害構成を「ユーザーが画像をアップロードし、サーバが ImageMagick で処理する Web」としている1820。CISA の KEV には 2024年9月に再掲されており、「古い話」ではない19。
Red Hat の解説では、HTTPS 用 delegate が wget を system() で呼ぶ例が示され、入力のリンク部分(%M)のフィルタ不足が注入点だと説明されている17。つまり注入されるのは HTTP のクエリではなく、画像フォーマットがサポートする「外部参照」やスクリプト的 coderである。OWASP の Unrestricted File Upload も、「GIF をリサイズしたら画像ライブラリの欠陥が突かれる」「ImageTragick」を脅威として挙げている14。
この層の防御はアプリのエスケープでは足りない。
- ImageMagick 公式はデフォルトを open(ほぼ許可)とし、公開サイトでは coder を絞れと明記する。インストール時に
websafe(GIF / JPEG / PNG 以外の読み書きを拒否)やsecure/limitedを選べる21。 policy.xmlで delegate 全拒否、危険 coder(HTTP(S)、URL、MVG、MSL、TEXT 等)の無効化、間接読み(@*)の禁止が定石である1721。- 処理前にマジックバイトで「自分が許可した形式か」を確認し、許可形式以外をエンジンに渡さない18。
- PDF / PS / EPS は Ghostscript に委譲されることが多く、ImageMagick 側の政策とは別に gs の更新とサンドボックスが要る。
- ffmpeg も同様に、コンテナ内の外部参照や危険なプロトコルをデフォルトのまま処理しない。
インジェクションではないが「アップロードでコマンドが動く」隣接
混同しやすいので分ける。
| 何が起きるか | 典型クラス | コマンドインジェクションとの違い |
|---|---|---|
.php / .cgi 等を Web 公開ディレクトリに保存し、後で HTTP 経由で実行される | CWE-434(危険な種別の無制限アップロード) | シェル文字列への注入ではなく、保存場所と実行権限の失敗14 |
| 画像パーサのバッファオーバーフロー等でコード実行 | CWE-119 / CWE-787 | データと命令の混同ではなくメモリ破壊。パッチとサンドボックスが主対策 |
| SVG / XML 画像の XXE でローカルファイルが読める | XXE | コマンド実行ではないが、アップロード処理の隣接リスクとして OWASP が挙げる15 |
Gyazo 公式の「任意のコマンドを実行」は (A)(B)(C) のどれでも、隣接の RCE でも説明できる。点検するなら「自前の system()」だけでなく、リサイズ・OCR・動画・URL 取得がどのバイナリを、どの設定で、どのファイル名で呼んでいるかまで見る。
どういう攻撃を受けうるのか
成立した瞬間に攻撃者が得るのは、「その Web プロセス(または画像処理ワーカー)と同じ権限で、OS にコマンドを出させること」である。以降の被害は、そのプロセスが触れるファイル・ネットワーク・秘密情報で決まる。IPA が挙げる脅威は次の 4 分類である4。
サーバ内ファイルの閲覧・改ざん・削除
設定ファイル、環境変数、クラウドの認証情報ファイル、ソース、他ユーザーのアップロードに触れれば、重要情報の漏えいや設定改ざんが起きる。Gyazo で流出した画像 URL 構成情報・セッション ID・連携トークンは、アプリが DB に持っていたデータをコマンド実行後に読み出された結果として説明できる(経路の詳細は非公表)1。
不正なシステム操作
アカウント追加、サービスの停止、意図しないシャットダウンなど。可用性への直撃である。CWE は影響範囲を機密性・完全性・可用性・否認防止にまたがるとし、実行されたコマンドはアプリ自身の行為に見えるため追跡も難しくなると指摘する2。
不正プログラムの持ち込み
ワーム、ボット、バックドア、仮想通貨マイナーなどの設置。一度入ると、入口の脆弱性を塞いでも残留する。Gyazo では 9月12日未明に不正接続切断と脆弱性修正、その後もフォレンジックを継続すると説明されている1。任意コマンド実行案件では「直した=掃除完了」にはならない。
他システムへの踏み台
同一 VPC / 同一クラスタ上のデータベース、内部 API、メタデータサービス、他テナントへ横展開する。IPA は DoS、攻略のための偵察、迷惑メール送信を例に挙げる4。Gyazo で被害を大きくしたのは、アップロードサーバー上のコマンド実行がデータベース到達まで繋がった点である。入口が Web の 1 プロセスでも、そのプロセスが本番 DB の認証情報を持ち、ネットワーク的に届くなら、漏えい規模は「その 1 台」ではなく「DB に載っている全件」になる。
典型的に狙われる「その先」
任意コマンド実行のあとに、実務でよく続くのは次である(一般的なインシデントパターンであり、Gyazo で使われた手順の再現ではない)。
- プロセスの環境変数・設定から DB 接続文字列やクラウドキーを読む。
- アプリと同じネットワークから DB クライアントを実行し、ダンプする。
- セッション ID や OAuth トークンを使い、正規ユーザーとして振る舞う。
- 画像 URL の秘密部分を一覧し、推測困難な URL 設計を無効化する。
Gyazo は画像 URL を推測困難な ID で守る設計だった、という解説が報道にある。それが事実だとしても、ID そのものが DB から持ち出されれば推測困難性は無意味になる。URL の秘匿は認可の代替にならない1。
シェルを介さない場合でも残る攻撃
OWASP の防御チートシートは、特殊文字をエスケープしても引数インジェクション(CWE-88)が残ると注意する5。シェルは起動していなくても、外部コマンドが「オプションとして解釈する文字列」をユーザーが渡せるため、情報開示から、コマンドによっては別のコード実行まで幅がある。防御は「記号を消す」だけでは足りない。
対策
優先順位は IPA・OWASP・CISA で一致している。エスケープは最後の手段である456。
本丸:OSコマンドを呼ばない
望む処理を、言語・フレームワークのライブラリで行う。CISA の例では、ディレクトリ作成にシェルの mkdir を使わず os.mkdir() を使う6。OWASP も「組み込みライブラリは、意図した以外の仕事に改変できない」ことを第一の防御とする5。画像処理なら、シェル越しの convert 呼び出しより、メモリ上で動く公式 SDK / バインディング(かつメンテナンスされているもの)を優先する。
「便利だからシェルで外部ツールを叩く」は、アップロード処理では特に高いコストの負債になる。
呼ぶなら:シェルを介さず、コマンドと引数を分離する
避けられない場合の原則は次である。
- 実行ファイルはハードコードする。ユーザーにコマンド名を選ばせない5。
- オプションもハードコードする。ユーザー入力はオペランド(ファイルパスや URL など)に限定する5。
- API は配列(リスト)で渡す。文字列連結でコマンドラインを作らない。
- Python:
subprocess.run(["tool", arg], shell=False)。CISA は PR チェックでos.system、文字列渡しのsubprocess.run、shell=Trueを禁止するルールを推奨する6。 - Java:
ProcessBuilderにコマンドと引数を別要素で渡す5。 - C:
system()ではなくexecve()系211。
- Python:
- POSIX の
--でオプション終端を示す。ユーザー入力が-で始まっても追加オプションにならないようにする5。 - 引数は許可リストで検証する。想定する文字種・長さ・形式以外は渡さず処理を中止する。IPA はホワイトリストを推奨し、
|<>などを拒否するブラックリストは漏れが起きるので非推奨とする4。OWASP もコマンド自体を許可リスト、引数を許可リストまたは厳格な正規表現で検証する二層を求める5。
PHP でシェルが避けられない場合、OWASP は escapeshellarg() を escapeshellcmd() より優先する。後者は追加パラメータを止められない5。ただしエスケープは OS・ロケール・エンコーディング依存で壊れやすく、OWASP Top 10 も「パースとエスケープは誤りやすく、基盤のわずかな変更で破綻する」と警告している8。
入力検証の置き場所
クライアント側チェックは迂回される(CWE-602)。検証はサーバ側で、コマンドに載せる直前にも行う2。
「自由文をメールの件名に載せる」のように記号を拒否できない入力は、拒否ではなく、シェルに渡さない設計に戻す。件名から ; を削ると機能が壊れ、残すとインジェクションになる、という CWE の指摘どおりである2。
固定のファイル名や URL の集合なら、ユーザー入力を実パスに直接使わず、数値 ID からサーバ側で実体へ写像する(Enforcement by Conversion)2。
被害を小さくする(防御の多層化)
入口を塞いでも取りこぼしはある。CWE / OWASP / IPA が揃って求めるのは最小権限である245。
| 層 | 何をするか | Gyazo 型の被害との関係 |
|---|---|---|
| プロセス権限 | 画像変換ワーカーは専用の低権限ユーザー。sudo・root 禁止 | 成功しても OS 全体を取れなくする |
| ファイルシステム | 読み書きをアップロード用ディレクトリに限定(chroot / コンテナ / seccomp / AppArmor / SELinux)2 | 設定ファイル・他テナントの画像を読めなくする |
| 秘密情報 | DB の管理者資格情報をワーカーに持たせない。タスクキュー経由で権限の異なるサービスが DB にだけ触る | コマンド実行 ≠ DB 全件ダンプ、に切り離す |
| ネットワーク | アップロードサーバーから本番 DB・メタデータサービス・インターネット(必要な変換 API 以外)へ出られない | 持ち出しと踏み台を物理的に難しくする |
| 監視 | 子プロセス起動、シェル起動、異常な DB ダンプ、大量 SELECT を検知 | Gyazo は同日夜に不正挙動を検知できている。検知の速さは被害時間を決める1 |
| WAF / RASP | コード修正までの応急、または多層の一枚。入力ベクトルを取りこぼし、正規リクエストも落としうるため効果は限定2 | 根本対策の代替にしない |
Helpfeel が再発防止で「認証・認可・アクセス制御」「監視・監査」「設計・開発・レビュー」を並べているのは、入口のパッチに加えてこの層を立て直す、という読みができる1。
開発プロセスで潰す
CISA は「1 件直す」のではなくクラスごと消すことを製造者に求めている6。
- 危険 API の使用を CI で拒否する(Semgrep 等のルール、言語の linter)。
- コードレビューで「外部入力がプロセス起動に届くか」を見る。ファイル名も入力である。
- SAST / DAST / IAST をパイプラインに載せる。OWASP はインジェクション検出にソースレビューと、パラメータ・ヘッダ・Cookie・JSON 等すべての入力への自動テスト(ファジング含む)の併用を勧める8。
- 画像・動画・文書の変換ライブラリは、シェルラッパではなくメンテされたバインディングを選び、CVE を追う。
- アップロード機能は「ファイルを保存する」だけでなく「保存後に外部コマンドが走るか」を脅威モデルに含める。
実装時のチェックリスト(防御側)
レビューや実装で確認する項目に落とすと、次のようになる。攻撃手順ではなく、自前コードを安全側に倒すための確認である。
- この処理は OS コマンドなしで実現できないか。
- 残すなら、実行ファイルとフラグは定数か。ユーザー入力は引数配列の 1 要素だけか。
- シェルを起動する API・フラグがゼロか。
- 引数は許可リスト(文字種・長さ・形式)を通っているか。パスならディレクトリトラバーサルも別途見ているか。
- ユーザー入力が
-で始まる場合に、外部コマンドのオプションとして解釈されないか。 - そのプロセスは本番 DB・クラウド管理キー・他ユーザーのファイルに届かないか。
- 失敗時のエラーメッセージが、内部コマンド名やファイル構成を返していないか2。
- アップロード後に convert / ffmpeg / tesseract / wget 等が走るか。走るならディスク上のファイル名は自前生成か15。
- ImageMagick を使うなら
policy.xmlは open のままになっていないか。許可形式は GIF/JPEG/PNG 等に絞っているか。delegate と HTTP(S)/MVG/MSL は落ちているか21。 - 処理前にマジックバイトで形式を確認し、許可外(SVG/PDF/PS を含む)をエンジンに渡していないか18。
この記事で確定させていないこと
公式一次情報と照合したうえで、断定を避けている点を挙げておく。
- Gyazo の脆弱性が CWE-78 だったかどうか。公式は「任意のコマンドを実行」まで。クラス名は非公表で、この記事は典型原因として解説し、断定していない。「任意コマンド実行」は影響であり弱点クラスではないので、CWE-94、CWE-502、CWE-434 等でも同じ影響になりうる。
- Gyazo が ImageMagick / ffmpeg / tesseract を使っていたかどうか。公式は「画像アップロードサーバー」「任意コマンド実行」「OCR テキスト」まで。ツール名は非公表で、この記事は起きうる経路の例として挙げている。
- Gyazo の画像 URL が推測困難な設計だったという話。公式お知らせにはなく、二次報道の設計解説である。本文では認可の代替にならない点だけを、公式事実(ID 流出)に結びつけて述べた。
- 件数と時系列は 2026-09-16 公表時点のスナップショット。Helpfeel はフォレンジック継続と「新たな事実が判明次第公表」を明記しており、件数や「任意コマンド実行」の技術的内訳は今後変わりうる。
- IPA の危険関数リストは例示で網羅ではない。Node.js の
child_process.exec、Ruby のバッククォート、Go のsh -cラッパなども同等リスクを持つ。 - ImageTragick は 2016年の欠陥だが、過去の話ではない。CISA KEV への 2024年再掲が示すとおり、未パッチ・緩い
policy.xmlの環境では今も実害対象になりうる。この記事はメカニズムと防御設定に留め、coder 名以上の再現情報は書いていない。 - CodeIgniter 勧告の影響バージョン表記。「< 4.6.1」とパッチ「4.6.2」が併記されており、NVD は 4.6.2 未満とする。この記事はパッチ適用先を 4.6.2 とした。
おわりに:Gyazo から取るべき教訓
- 任意コマンド実行は、アカウント乗っ取りより前にデータ全件の問題になる。セッションやパスワードハッシュの話の前に、ホストを取られた時点で DB が読める設計かどうかが勝負を分ける。
- 推測できない URL は認可ではない。ID が DB から出れば終わる。
- アップロードは高リスク機能である。ファイル保存だけでなく、変換・サムネイル・OCR・動画エンコードといった子プロセスが攻撃面になる。
- クラスとして潰す。1 箇所の
system()を直しても、隣のワーカーが同じ書き方なら再発する。CISA が言う Secure by Design はここを指す6。 - 公式が CWE を出していなくても、自サービスの同じ形は点検できる。画像変換、PDF、ffmpeg、シェル付きの運用スクリプト、管理画面の「疎通確認」は、発表を待たずに棚卸し対象になる。
参考文献
- 「Gyazo」への不正アクセスによる情報漏えいに関するお知らせとお詫び|株式会社 Helpfeel(2026-09-16) https://corp.helpfeel.com/news/news-20260916-1
- CWE-78: Improper Neutralization of Special Elements used in an OS Command (‘OS Command Injection’)|MITRE https://cwe.mitre.org/data/definitions/78.html
- 2024 CWE Top 25 Most Dangerous Software Weaknesses|MITRE https://cwe.mitre.org/top25/archive/2024/2024_top25_list.html
- 安全なウェブサイトの作り方 1.2 OSコマンド・インジェクション|IPA https://www.ipa.go.jp/security/vuln/websecurity/os-command.html
- OS Command Injection Defense Cheat Sheet|OWASP Cheat Sheet Series https://cheatsheetseries.owasp.org/cheatsheets/OS_Command_Injection_Defense_Cheat_Sheet.html
- Secure by Design Alert: Eliminating OS Command Injection Vulnerabilities|CISA / FBI(2024-07-10) https://www.cisa.gov/resources-tools/resources/secure-design-alert-eliminating-os-command-injection-vulnerabilities
- Command Injection|OWASP Foundation https://owasp.org/www-community/attacks/Command_Injection
- A05 Injection|OWASP Top 10:2025 https://owasp.org/Top10/2025/A05_2025-Injection/
- 2024 CWE Top 10 KEV List Insights|MITRE https://cwe.mitre.org/top25/archive/2024/2024_kev_insights.html
- CWE-77: Improper Neutralization of Special Elements used in a Command (‘Command Injection’)|MITRE https://cwe.mitre.org/data/definitions/77.html
- ENV33-C. Do not call system()|SEI CERT C Coding Standard https://wiki.sei.cmu.edu/confluence/display/c/ENV33-C.+Do+not+call+system%28%29
- Injection Prevention Cheat Sheet|OWASP Cheat Sheet Series https://cheatsheetseries.owasp.org/cheatsheets/Injection_Prevention_Cheat_Sheet.html
- CWE-88: Improper Neutralization of Argument Delimiters in a Command (‘Argument Injection’)|MITRE https://cwe.mitre.org/data/definitions/88.html
- Unrestricted File Upload|OWASP Foundation https://owasp.org/www-community/vulnerabilities/Unrestricted_File_Upload
- File Upload Cheat Sheet|OWASP Cheat Sheet Series https://cheatsheetseries.owasp.org/cheatsheets/File_Upload_Cheat_Sheet.html
- GHSA-9952-gv64-x94c Command Injection Vulnerability in ImageMagick Handler|CodeIgniter4(CVE-2025-54418) https://github.com/codeigniter4/CodeIgniter4/security/advisories/GHSA-9952-gv64-x94c
- ImageTragick - ImageMagick Filtering Vulnerability CVE-2016-3714|Red Hat https://access.redhat.com/security/vulnerabilities/ImageTragick
- VU#250519 ImageMagick does not properly validate input before processing images using a delegate|CERT/CC https://www.kb.cert.org/vuls/id/250519
- CVE-2016-3714|NVD https://nvd.nist.gov/vuln/detail/CVE-2016-3714
- Alert Regarding Vulnerability (CVE-2016-3714) in ImageMagick|JPCERT/CC https://www.jpcert.or.jp/english/at/2016/at160021.html
- ImageMagick Security Policy|ImageMagick Studio https://imagemagick.org/security-policy/
- 「Gyazo」への不正アクセスに関する「Helpfeel」「Cosense」への影響と実施中の対応について|株式会社 Helpfeel(2026-09-18) https://corp.helpfeel.com/news/news-20260918