セキュアなソフトウェアアーキテクチャー
セキュアなソフトウェアアーキテクチャーに関するプレゼンを公開しました。
これだけだと契約プログラミングがどういうモノなのかよく分からないと思います。
を参考にしてください。
セキュアなソフトウェアアーキテクチャーに関するプレゼンを公開しました。
これだけだと契約プログラミングがどういうモノなのかよく分からないと思います。
を参考にしてください。
このブログでは二段階認証にGoogle認証システム(スマホアプリ)とGoogle Authenticator(WordPressプラグイン)を使っています。携帯の修理でGoogle認証アプリを入れ忘れていたので、またブログにアクセスできなくなりました。前回はデータベースを直接操作してGoogle Authenticatorプラグインを無効にしたのですが、もっと簡単な方法があったので紹介します。
目的と手段、これを取り違えて大きな誤りを犯してしまうことはよくあります。これはセキュリティ対策に限ったことではありません。
対策をセキュリティ対策の目的と手段を取り違えると、根本的な誤りを犯してしまいます。
備考:目的と手段の取り違えが根本的な原因と言えますが、「セキュリティ対策」定義を取り違えているとこのブログの内容は理解しずらいかも知れません。セキュリティ対策に「緩和策」や「リスク増加」が含まれることを認識されていない方はまずセキュリティ対策の定義を確認ください。
OpenSAMMのSAMMとはSoftware Assurance Maturity Model(ソフトウェア保証成熟度モデル)の略で名前の通り、成熟度モデルの一種です。成熟度モデルで有名な米カーネギーメロン大学のCMMI(Capability Maturity Model Integration – 能力成熟度モデル統合)同類の成熟度モデルに基づくセキュアなソフトウェア開発の方法論です。OpenSAMMはCMMIに比べるとかなり簡易化されており、小さな組織でも導入しやすいモデルになっています。
SAMMはプライバシーマーク認証やISMS認証を取得している組織でも有効です。これらの認証制度と重複している部分もありますが、ソフトウェア品質保証に特化したSAMMはより効果的かつ広範囲にセキュア開発をサポートできます。SAMMより広範囲な領域をサポートするCMMIを導入している組織には必要ありません。
私の会社では比較的導入しやすいセキュア開発メソドロジーであるSAMMを推奨し、導入サポートも行っています。SAMMは新しい物ではなく7年ほど前に最初のバージョンがリリースされており、当時から推奨しています。
このブログを継続的に読んでいる方なら私が「個々のセキュリティ脆弱性対策も重要だが、基本的考え方や概念はより重要である」と考えていることがわかると思います。「個々の脆弱性対策だけやれば良い」とする議論がありますが、これには色々な欠陥があります。このため、「個々の脆弱性対策だけやる」では効果的なセキュリティマネジメントができません。つまり、より危険なセキュリティになってしまいます。
追記:このエントリだけではなぜマネジメントが大切なのかは伝わらないと思うので、容易に導入できるセキュア開発メソドロジー – OpenSAMM を書きました。こちらも参照ください。
徳丸さんとの議論は終わっている いるので議論することはありません。しかし、 ここが変だよ、グローバルスタンダードの脆弱性対策~入力値の考え方~ というおかしなスライドが目に入ったのでコメントしておきます。今現在で2万近くのビュー回数もあると放っておけません。
”セキュリティ専門家”という肩書を持つ方が非論理的/非科学的な独自のセキュリティ理論を展開されるようでは、誤解してしまった開発者がセキュアでないコードを書いてしまいます。どのように非論理的/非科学的なのか簡単にコメントします。
入力バリデーションはセキュリティ対策として最も重要なセキュリティ対策です。なぜセキュリティ対策であるのか?を理解していない方も見かけますが「ほぼ全てのインジェクション攻撃を無効化/防止する入力バリデーション」の効果と拡張方法を見れば解るのではないでしょうか?
ソフトウェア開発者が知っておくべきセキュリティの定義/標準/ガイドで紹介しているセキュリティガイドラインでは入力バリデーションが最も重要なセキュリティ対策であるとしています。
厳格な入力バリデーションを行うと、開発者が意識しなくても、非常に多くの脆弱性を利用した攻撃を防止できます。今回は比較的緩い入力バリデーション関数でも、ほとんどのインジェクション攻撃を防止できることを紹介します。
重要:セキュア/防御的プログラミングでは入力と出力のセキュリティ対策は”独立”した対策です。どちらかをすれば良い、ではなく入力と出力の両方で対策を行います。よく誤解されるので注意してください。
重要 その2:ホワイトリストの基本中の基本は”デフォルトで全て拒否する”であることに注意してください。全て拒否した上で、許可するモノ、を指定しないとホワイトリストになりません。ホワイトリストによる入力バリデーションは”無害化”ではありません。”妥当性の検証”です。
重要 その3:あまり広く理解されていませんが、セキュアコーディングの第1原則は「全ての入力をバリデーションする」、第7原則が「全ての出力を(エスケープ/API/バリデーションで)無害化する」です。セキュアコーディングはISMS/PCI DSSなどの認証規格の要求事項です。
なぜこのようなブログを書いたか?というと入力バリデーションしていても、”ほぼ全てのインジェクション攻撃を無効化/防止できる入力バリデーション”でない場合、入力時のセキュリティ処理だけでは”残存リスク”としてインジェクション攻撃が可能になる、という事を理解して欲しいからです。
参考:
Fedoraもfedupを使って簡単に更新できるようになって便利になりました。しかし、システムにインストールされているrescueイメージとカーネルが古くなっても更新されません。さすがにFedora22でFedora18頃のrescueイメージとかカーネルでは怖いので更新方法を調べてみました。
「攻撃者がどうやって脆弱性を見つけ攻撃するのか」これは比較的よくセキュリティ対策で解説されていることだと思います。本質を理解し、対策を考えます。
コンピュータセキュリティのことを考えるとShellcode(シェルコード)のことを忘れる訳にはいきません。Shellcodeとはバッファーオーバーフローを利用してコンピューターに任意コードを実行させるコードの総称です。そもそもは/bin/shなどのシェルを奪うコードが主だったので、この種のコードはShellcodeと呼ばれています。現在はシェルを奪う物だけでなく、他の操作を行う物もShellcodeと呼ばれています
Shellcodeを作る方は、山があるから登るのと同じで、Shellcodeが作れるから作る、のだと思います。
私個人はShellcodeを作ること、使うことに全く興味はないです。しかし、Shellcodeとそれを利用した攻撃は、防御の為に興味を持っています。簡単に今どきのShellcodeはどのようになっているのかまとめます。
今後WebシステムをインターフェースとするIoTデバイスが続々と出てくると思われます。その中で特に危惧しているセキュリティ問題があります。その1つがリクエストフォージェリです。
リクエストフォージェリ(Request Forgery – リクエスト偽造)はかなり古くから知られている脆弱性です。恐らく1980年代から良く知られていたはずです。昔から知られているSSRFとCSRFの類似性を考えてみます。類似性を考えると、少し解りづらいCSRFも簡単に理解できるかも知れません。
単純にこういった定義や標準があります、と紹介してもなかなか原文を参照することは敷居が高いです。このブログでも色々紹介できてきたので、ソフトウェア開発者が知っておくべきセキュリティの定義/標準/ガイドなどをまとめて紹介します。
PHPカンファレンス関西に参加してきました。私のセッションの資料をPDFまたはSlideshareで見れるようにしました。
CERTは米カーネギーメロン大学に設置されたコンピュータセキュリティ対策を行う老舗の組織です。CERTが設立される前もセキュリティが無視されていたのではありませんが、CERT設立後と前ではコンピュータセキュリティ、特にソフトウェアセキュリティに対する考え方が大きく変わりました。詳しくはセキュアプログラミング(防御的プログラミング)の歴史をざっと振り返るを参照してください。
CERTはSecure Coding Standardsとして
を公開しています。その中でもセキュアコーディング(セキュアプログラミング/防御的プログラミング)で最も重要なトップ10をTop 10 Secure Coding Practicesとしてまとめています。
日本語訳が無いようなので資料として利用できるよう私訳しておきます。
(追記:IPAのセキュアコーディングガイドは入力対策が出鱈目でした。 2017年からやっとIPAがCERT Secure Coding Practicesをセキュアコーディングの”原則”として紹介するようになりました。CERT版では出力対策を7番目に記載しています。IPAは順序を変えて2番目にしています。トップ10の原則とする際に順序を入れ替えるのは混乱の元です。オリジナルの順序のままにすべきだと思います。順序を変えると外国人とコミュニケーションが取れなくなります。)
よく勘違いされているので書いておきます。入力対策と出力対策は”独立したセキュリティ対策”です。間違えないようにしましょう。
入力バリデーションが第1位の対策であるのは科学的/論理的/原理的な理由が根拠となっています。最も重要な対策ですが、よく誤解されています。
参考: