開発者がMISRA CやMISRA C++ガイドラインについて考えるとき、すぐに思い浮かべるのは組み込みシステムです:自動車のECU、飛行制御ソフトウェア、医療機器、ロボットローバー。これらのルール——動的メモリの落とし穴を禁止し、ポインタ演算を制限し、突然の制御ジャンプを禁じるもの——は、ソフトウェアのクラッシュが物理的な被害をもたらしうるシステム専用だという認識が一般的です。
最近の注目を集めたセキュリティ事件が、その思い込みを打ち砕きます。
PHPエンジンのコアで発見された重大な「PHP2Shell」リモートコード実行脆弱性(CVE-2026-109618およびCVE-2026-109619)は、C言語における低レベルのメモリ管理と制御フロー管理の失敗が、高レベルのWebアプリケーションを世界的に危険にさらすことを実証しています。
これらの脆弱性がなぜ起きたのかを注意深く見ると、それらはMISRA標準が何十年も禁止してきた核心的な安全原則に対する教科書的な違反であることが分かります。MISRA準拠の哲学が、マイクロコントローラを作る人であれWebランタイムを作る人であれ、すべてのソフトウェアエンジニアにとって重要である理由を説明します。
分離の幻想:高レベル言語、低レベルエンジン
PHPは、何百万ものWebアプリケーションやコンテンツ管理システムに依存されている高レベルのインタプリタ型スクリプト言語です。Web開発者は、ランタイム環境が裏側でメモリ管理、型安全性、クリーンアップを処理してくれると信じて、クリーンで表現力のあるコードを書いています。
しかし、PHPの基盤となるエンジン(Zend Engine)は完全にCで書かれています。
Cコアに脆弱性が存在する場合、アプリケーションレベルのセキュリティ機構は完全に無意味になります。認証されていない攻撃者は、あなたのPHPスクリプトロジックの欠陥を必要としません。基盤となるランタイムエンジンを悪用して、完全なリモートコード実行(RCE)を達成できるのです。
PHP2Shell:それを引き起こした組み込み安全の悪夢
PHP2Shellアドバイザリは、完全に危険なCプログラミング構造に根ざした2つの重大な脆弱性を強調しています:
1. CVE-2026-109618:Out-of-Memory(OOM)状態の破壊
何が起きたか: 受信リクエストがOut-of-Memoryエラーを引き起こすと、PHPはCの標準longjmp()機構に依存して、現在の実行コンテキストを強制的に中止して脱出します。
Cの欠陥: longjmp()は通常のスタックアンワインドをスキップするため、セットアップ途中のデータ構造が部分的に初期化されたまま残りました。後でリクエストのクリーンアップルーチンが実行されたとき、この無効で半端なメモリを有効なデータとして扱い、RCEにつながるメモリ破壊ベクトルを導入しました。
2. CVE-2026-109619:古いグローバル状態とuse-after-free
何が起きたか: 高性能ワーカープロセス(PHP-FPMなど)は、数千のリクエストを順次処理し、同じプロセスメモリプールを再利用します。
Cの欠陥: リクエストメモリを一時的に指していたグローバル状態ポインタが、終了時に適切にクリアされませんでした。メモリが解放された後もグローバルポインタが存続し、同じワーカーが処理した後続のリクエストが古いダングリングなメモリ状態を読み取って分岐するuse-after-free状態となりました。
これがMISRAと何の関係があるのか?
MISRA CとMISRA C++が定めたルールを確認すると、これらとまったく同じパターンが安全 critical な環境で明示的に禁止されていることが分かります:
- setjmpとlongjmpの禁止(MISRA C ルール21.4/MISRA C++ ルール17-0-5): MISRAは非ローカルジャンプを完全に禁止しています。標準的な構造的クリーンアップをバイパスし、リソースを孤立させ、メモリを不確定な状態に残すからです。致命的なエラー処理におけるPHPのlongjmp()式の脱出への依存は、まさにMISRAが防ぐアンチパターンです。
- 決定論的な状態管理: MISRAルールは変数とメモリの厳格なライフサイクル追跡を強制します。未初期化変数、ダングリングポインタ、ループやルーチンをまたぐ古いグローバル状態の再利用は、必須の静的解析警告を引き起こします。
要するに、PHPエコシステムを揺るがした脆弱性は、厳密なMISRA準拠の静的解析ツールが即座にフラグを立てるようなものです。
教訓:防御的コーディングはあらゆる場所に適用される
私たちはソフトウェアエンジニアリングをサイロに分割しがちです:
- 組み込み/安全 critical: 厳格な静的解析、MISRA準拠、メモリバグへのゼロトレランス、形式的検証が必要。
- エンタープライズ/Web/クラウド: 高速なイテレーション、自動ガベージコレクション、高レベル言語の安全性に依存。
PHP2Shellは、この境界が蜃気楼であることを証明しています。エンタープライズWebインフラストラクチャは、その上で実行される管理されていない低レベルのC/C++ランタイム、コンパイラ、依存関係と同じ程度にしか安全ではありません。
チームが技術的負債、循環的複雑度、構造的完全性を管理するためにAIエージェントや自動化ツール(CppDependなど)をワークフローにますます統合する中で、核心的な使命は明確です:安全なコーディング標準は、自動車やペースメーカーだけのものに予約されるべきではありません。構造的コードガバナンス、厳格なリソースライフサイクル管理、自動化された静的解析という厳密な規律をすべてのソフトウェアレイヤーに適用することこそが、現代のテックスタックをシステミックな低レベル欠陥から隔離する唯一の方法です。

