====== 外部データにserialize/unserialize_は利用しない ======
PHPのserialize/unserialize関数は安全なデータストレージなどにPHP変数を保存する為に利用します。一旦、外部に保存されたデータ($_POST、$_GET、$_COOKIEなど)は改ざんされ、unserialize時に不正なデータとなっている可能性があります。この結果、不正な値に改ざんされたり、不正なオブジェクトを注入されたり、メモリ管理の不具合(解放済みアドレスの利用など)による任意コード実行が行われたりします。
現在のPHP(2017年9月以降)では不正なシリアル化データによるメモリ管理の不具合はセキュリティ問題として修正されません。
===== 非適合コード例 =====
$mydata = unserialize($_GET['mydata']);
===== 適合コード例 (JSONの利用) =====
JSONを利用する場合、不正なオブジェクトの注入は不可能になり、メモリ管理の不具合のリスクはほぼ無くなります。
$mydata = json_decode($_GET['mydata']);
データの改ざんは可能である点に注意
===== 適合コード例 (HMACなどの利用) =====
HMACやHKDFで改ざんされていないこと検証している場合、信頼可能である。
if ($_GET['mac'] && $_GET['mac'] === hash_hmac('sha3-512', $_GET['mydata'], $_SESSION['hmac_key']) {
throw new Exception('$_GET[mydata] is modified by user');
}
$mydata = json_decode($_GET['mydata']);
この例の場合、HMACで改ざんを検出しているので不正なデータやオブジェクト、攻撃用データが挿入されていないことを保証できる。
ただし、再生攻撃に対して脆弱である点に注意する
HKDFを利用し、$info引数に有効期限を設定すると再生攻撃リスクを緩和可能である
===== 例外 =====
[ルール/推奨事項の例外]
===== リスク評価 =====
[ルール/推奨事項のリスク評価]
[評価例 - 英語表記に統一]
^ Rule ^ Severity ^ Likelihood ^ Remediation Cost ^ Priority ^ Level ^
| IDS05-J | medium | unlikely | medium | P4 | L3 |
===== 関連ガイドライン =====
===== 参考文献 =====