# セキュアコーディングフレームワーク
## 定義
セキュアコーディングフレームワーク(secure coding framework)とは、セキュリティとリライアビリティ上の不変条件を、開発者個々の注意力やレビュー体制ではなく、型システムと共通フレームワークの構造そのものによって強制する設計アプローチである。核となる発想は、危険な使い方をそもそも記述できないインターフェースだけを公開することにある。代表例が`TrustedSqlString`型で、SQLクエリ文字列がソースコード中の文字列リテラルのみから構成されることを言語機構(Goのパッケージプライベート型エイリアス、JavaのError Prone `@CompileTimeConstant`、C++のテンプレートコンストラクタ等)によってコンパイル時に強制し、ユーザー入力とSQLの混在を設計上不可能にする。同じ発想はXSS対策の`SafeHtml`/`SafeUrl`/`TrustedResourceUrl`にも適用され、HTMLの挿入文脈(要素内容・URL属性等)ごとに異なる型を導入し、各型のコンストラクタだけが安全性の契約を保証する「信頼済みコードベース」を構成する。ガイドラインの周知やコードレビューによる事後チェックと異なり、この方式は違反そのものをコンパイルエラーとして即座にフィードバックする点が最大の特徴であり、フィードバックが早いほど開発者は変更中のコードの文脈を保ったまま安全なAPIへの書き換えを受け入れやすくなる。またRPCバックエンド向けフレームワークのように、認証・認可・ロギング・レート制限といった横断的関心を「インターセプタ」としてフレームワーク側に集約し、ドメインエキスパートが1箇所を修正するだけで全アプリケーションに修正を波及させる構造も、同じ「個人の注意力でなく構造で強制する」思想の別の現れである。すべての用途を安全な型だけでカバーしきれない場合は、専門家レビュー付きの制約回避経路(Googleの`unsafequery`パッケージ等)を少数のゲートに絞って用意し、既存コードの移行は全面書き換えではなく、レガシーAPIを既存呼び出し元だけに制限する段階的ロールアウトか、レガシー変換関数を1箇所に一元化する方式で無理なく進める。(Source: [[@2020__OReilly__Building Secure and Reliable Systems - Chapter 12 Writing Code]] §Frameworks to Enforce Security and Reliability, §SQL Injection Vulnerabilities: TrustedSqlString, §Preventing XSS: SafeHtml, §Rollout Strategy)
## 横断的知見
- (現時点でこの概念に紐づくソースは1件のみ。2件目以降のソースが加わり次第、複数ソースの突き合わせで見える知見をここに蓄積する。)
## 未解決の問い
- 型による構造的強制(コンパイル時の不変条件強制)と、第13章で扱われる静的解析・ファジングによる事後検知は、どのような役割分担になるのか。本概念のソース(ch.12)は型強制を主眼とし、静的解析・ファジングとの使い分けの原則までは踏み込んでいない。
- `unsafequery`のような制約回避経路のレビュー負荷が「ローテーション制のエンジニア1名で数百〜数千人の開発者に対応できる」水準に収まるのは、どのような組織規模・レビュー文化が前提になっているか。Google以外の組織でも同程度の比率が成立するかは未検証。
- 段階的ロールアウト(既存呼び出し元だけを許可リスト化する)とレガシー変換の一元化という2つの移行戦略は、どのような状況でどちらを選ぶべきかの判断基準が明示されていない。両者を併用した事例があるかも今後の ingest で確認したい。
- TrustedSqlString/SafeHtmlのような「型で不変条件を強制する」アプローチは、SQLインジェクション・XSS以外のOWASPトップ10の脆弱性クラス(壊れたアクセス制御、安全でないデシリアライズ等)にどこまで一般化できるか。ch.12のOWASP対応表は方向性のみを示しており、型設計の具体的な実装パターンまでは踏み込んでいない。
## 関連
- 概念: [[ソフトウェア複雑性]](型による不変条件の強制は、依存・不明瞭さという複雑性の構造的原因のうち「不明瞭さ」をコンパイラの検査可能な形に変換する試みとして位置づけられる) / [[技術的負債]](型強制を回避する経路や移行未了のレガシーAPIは、それ自体が管理すべき技術的負債になりうる)
- ソース: [[@2020__OReilly__Building Secure and Reliable Systems - Chapter 12 Writing Code]]
- 関連章: [[@2020__OReilly__Building Secure and Reliable Systems - Chapter 13 Testing Code]](静的解析・ファジングによる事後検知) / [[@2020__OReilly__Building Secure and Reliable Systems - Chapter 14 Deploying Code]](サプライチェーンの保護)
- 関連 MOC: [[structures/Software Engineering - MOC]]
## 出典
- Heather Adkins et al. (eds.), *Building Secure and Reliable Systems*, O'Reilly Media, 2020, Chapter 12: Writing Code (By Michał Czapiński and Julian Bangert).