features)」はソフトウェアセキュリティではない、としています。features.ソフトウェアセキュリティはセキュリティソフトウェアではない。全ての魔法のような暗号などはあなたのソフトウェアを魔法の様に安全にはしない、不可欠なセキュリティ機能の場合では削除/省略することが不可能であることは事実だが。暗号を例に「HTTPSがソフトウェアをセキュアにはしない」としています。これは暗号だけには留まりません。7PKとはソフトウェアセキュリティ全体を包括する7つの脆弱性分類を定義する論文です。実際には7つの領域+1つ(環境)を定義しています。features)は認証/認可/暗号などのセキュリティ機能の脆弱性を意図した分類です。特定のセキュリティ機能を使えば自動的にセキュアなソフトウェアになるのではない現実があり、「セキュリティ機能」では取り扱っていないセキュリティ領域にも注意しなければならない、としています。ソフトウェアセキュリティはセキュリティソフトウェアではないは暗号や認証/認可などのセキュリティ機能のみに適用されるモノではない、と解ります。「セキュリティ関連API」も「セキュリティ機能=セキュリティソフトウェア」と捉えることができます。7PKの悪質な領域の一つ、「APIの乱用」では、ざっくり言うとAPIの呼び出し側が呼び出される側の契約(仕様)を考慮せずに呼び出すこと呼び出されたAPIが契約(仕様)とは異なる結果を返すことが問題となるとしています。「APIの乱用」は頻繁に見られる間違いで、よくある間違いに◯◯対策は△△API(=セキュリティ機能)を使うだけで十分/完璧だがあります。全ての”よくある”インジェクション対策に言えるのですが、SQLインジェクション対策を例に間違いであることを紹介します。SQLインジェクション対策はプリペアードクエリ/プレイスホルダを使うだけで十分/完璧だこれを聞いた事がない開発者は居ないと思います。これだけでは全く不十分です。SQLクエリを作るには、プリペアードクエリ/プレイスホルダで無害化できるSQLクエリパラメーター、以外にSQL識別子やSQL語句も必要です。SQLクエリパラメーターを正しく実行するにはLIKE句や正規表現、今時のDBならJSONやXMLといったデータがパラメーターになることも考慮しなければなりません。それ以前に、クエリを送る側(=APIの呼出側)がデータ(=パラメーター)が妥当な値であるかバリデーションしていなければ、DBやDBアクセス用のAPIではエラーや不正入力を防止することが出来ません。参考:完全なSQLインジェクション対策プリペアードクエリ/プレイスホルダは「SQLパラメーターの無害化を行う責任(契約)」だけを持っています。(正規表現、JSON、XMLなどとして無害であるか?妥当であるか?)などの必要なセキュリティ機能には全く役立ちません。SQLインジェクション対策はプリペアードクエリ/プレイスホルダを使うだけで十分/完璧だとしているセキュリティガイドや”セキュリティ専門家”が更に悪いのは入力バリデーションの重要性を無視/軽視していることです。入力バリデーションはセキュリティ対策ではない/重要ではない/単なる仕様であるとして「入力バリデーション」を無視しているセキュリティガイドまであります。このようなガイドは危険極まりないガイドであるのですが、中には長年堂々と公開されているモノもあります。その代表がIPAの「安全なウェブサイトの作り方」です。IPAの「安全なウェブサイトの作り方」は安全な作り方のガイドではない”ソフトウェアセキュリティを理解しているセキュリティ専門家”が読んだら、噴飯物の出鱈目なガイド、ですが長年安全なWebアプリケーションソフトウェアのガイドとして公開されています。まとめIPAのセキュリティガイドと言えば、ベストプラクティスやセキュリティ標準を十分に考慮したガイドである、と普通の人/開発者なら思うでしょう。実際にはソフトウェアセキュリティの基礎の基礎から間違っているセキュリティガイドであるのがIPAの「安全なウェブサイトの作り方」です。専門家や専門組織が基礎から間違ったことをまるで正しいことかのように解説する、こういった事は時々あります。騙されないようにするには何事でも、権威があるから、と鵜呑みにしないことが重要です。セキュリティ機能を使う、ではソフトウェアセキュリティは作れないAPIを使うだけ、ではソフトウェアセキュリティは作れない安全なソフトウェアを作るには、総合的/全体的に整合性のある対策が欠かせません。◯◯には△△”だけ/さえ”使えばよい、とするセキュリティ対策はほぼ全て不十分でダメな対策です。ダメな例:WAF”さえ”使っていれば安全なソフトウェアになるプリペアードクエリ”だけ”使っていれば安全にSQLを実行できるexecv系(コマンドと引数が分離されているAPI)”さえ”使っていれば安全にコマンドを実行できる自動エスケープするHTMLテンプレートシステム”さえ”使っていれば安全にHTMLを表示できる数えだしたらキリがありません。セキュリティソフトウェア(機能やAPI)は、ソフトウェアセキュリティに役立ったり、欠かせない物であったりしますが、”自分が作っている”ソフトウェアセキュリティはそれら”だけ”で確保できる物ではありません。そのソフトウェアを作っている開発者自身が責任を持って必要な対策全てを実施して、初めて必要なソフトウェアセキュリティを確保できるようになります。開発フレームワークの機能”だけ”使っていれば良い適当なAPI”さえ”使っていれば良い更に悪いことに、セキュアなソフトウェア構築で最も重要な入力バリデーションを入力バリデーションはソフトウェアセキュリティではない/重要ではない/単なる仕様であると勘違いしているケースがほとんどです。これでは十分なソフトウェアセキュリティの達成は遠退くばかりです。ソフトウェアのセキュリティこの認識は全てのソフトウェアエンジニアが意識している必要があります。7PK論文の全文はMITREがPDFで公開しています。DSS/GDPRなどの情報セキュリティ標準/法規制の基礎知識として要求される知識の一つと考えられます。同じ”ソフトウェア”と言っても、”アプリケーション”は専用ソフトウェア、”ライブラリ”は汎用ソフトウェアであり”性質”が異り、”責任”が異なる。ユーザーが利用するソフトウェア全体(≒アプリケーション)としてのセキュリティを保証する責任は”アプリケーション”にはあるが、”ライブラリ”には必ずしもない。今すぐできる、Webサイトへの2要素認証導入そもそもエスケープとは何なのか?PostgreSQLの文字列型の最大長は?2要素認証のTOTPとHOTP、どちらがより安全か?完全なSQLインジェクション対策PHPのHTMLエスケープ紹介エレクトロニック・サービス・イニシアチブのWebシステムのコンサルタントのブログです。PHPの開発、PHP4.x/5.xレガシーPHPセキュリティパッチサービスなどを行っています。ブログのサブタイトルを「書かない日記」としているのは、ブログを始めた時にあまり書かないつもりで始めたのでこのサブタイトルになっています。yohgaki@ohgaki.net私が記述したブログ中のコードは記載が無い場合はMITライセンスです。その他のコードは参考リンクなどのライセンス情報を参照ください。