許可リストは解析が成立した入力にだけ適用する — 解析不能は許可より優先して違反に倒す
信頼性
開発運用
判断
コマンド監査・アクセス判定など、入力を構文解析してから許可/違反を分類する検査では、「解析できなかった入力」を info 扱いで素通りさせると、複雑なクォート・ラッパー形式の入力が検査の死角(false green)になる。逆に正当な定型実行を許可する仕組みが無いと、毎回人手の裁定が要る false positive が決定論的に再発する。
判断基準
- 分類を三値にする: 解析済み違反(deny 一致)/ 解析済み許可(allow 一致は info 列挙に留める)/ 解析不能(クォート不均衡・ラッパー形式なのに中身を取り出せない等)。
- 解析不能は allow 判定より優先して違反に倒す。何が実行されたか検証できない入力を許可しない — 許可の前提は解析の成立。
- 過検知(読み取り専用の複雑クォートコマンドが違反扱いになる等)は許容し、逸脱記録・人の確認で吸収する。素通りの温存より安い。
- allow パターンは検査の呼び出し文脈ごとに狭く渡す(この検査で正当と分かっている実行だけに一致する形)。恒常の広い許可は監査の骨抜きになる。
なぜ
解析器の能力を超えた入力は「違反が無いことを確認できた」のではなく「確認できなかった」。この2つを同じ合格に潰すのが素通りの正体で、意図的な難読化にも同じ経路が使える。
検証
故意ずれ検体を最低4クラス用意する: 解析不能に隠れた実行系(違反になること)/ allow 一致の正当実行(許可されること)/ allow 非一致の実行系(allow を渡しても違反のままであること)/ allow に一致し得る解析不能(許可されず違反になること=優先順位の検証)。