X

Security

コンピュータは数値さえ正確に扱えない

コンピュータで数値を正確に扱うのは「実は結構難しい」です。つまり「コンピューターは数値を正確に扱えない」という事です。「コンピューターが数値を正確に扱えない?!何を言ってるんだ?!」と思った方は是非読んでみてください。 (さらに…)

Struts 2の脆弱性でHTTPのContent-Typeヘッダーからリモートコード実行ができる理由

Apache Struts2 の脆弱性対策について(CVE-2017-5638)(S2-045)は HTTPプロトコルのContent-Typeヘッダーでリモートからコード実行ができる という問題です。どうして「Content-Typeヘッダー」でコード実行ができたのか?気になったので調べたメモです。 コード実行ができた理由は「国際化(翻訳)用のメッセージ処…

HMACを利用した安全なAPIキーの送受信

Webアプリケーションの機能をサービスとして提供する場合、ランダムな値の秘密のAPIキーを鍵とすることが多いです。 // 何らかのAPIを呼び出す http://example.com/api/v2/get_something?api_key=qwertyuiop シンプルな方法で使いやすいですが、鍵となるAPIキーをそのまま使っているので鍵が漏洩する可能性…

hash_hmac()の使い方

HMACの応用的な使い方をここ数本のブログで書いてきましたが、HMACの基本的な使い方を紹介していませんでした。リクエストパラメーターを安全に検証/バリデーションする方法を例に紹介します。unserialize()を安全に利用する利用例にもなります。 参考: https://blog.ohgaki.net/summary-how-to-use-hash_hm…

ハッシュ(HMAC)を使って弱い鍵を強い鍵に変える方法

既存の鍵から別の鍵を導出する方式としてはHKDF(RFC 5869)があります。AES用に弱い鍵から強い鍵を作るにはHKDFでなくてもHMACで十分です。実際、HKDFはHMACを組み合わせて鍵を導出しているだけなので、ここで紹介するHMACのみの鍵導出と同等です。 ※ PHP 7.2からHKDFを実装したhash_hkdf()を使えます。hash_hkdf…

ハッシュ(HMAC)を使ってパスワード付きURL/URIを作る方法

より高度なCSRF対策 – URL/URI個別にバリデーションする方法でハッシュ(HMAC)を使えばデータベースを使わずに有効期限付きのURLを作れる、と紹介しました。今回はパスワード付きURL(URI)の作り方を紹介します。 (さらに…)

より高度なCSRF対策 – URL/URI個別にバリデーションする方法

ハッシュ関数は色々な場面で利用できます。このエントリではハッシュ関数の使い方、特にリクエストにサインする方法として、データベースを使わずURI個別のCSRFトークンを生成しバリデーションする方法を紹介します。 (さらに…)

ISO 27000の入力データ妥当性確認

セキュリティ標準では入力データの妥当性確認(入力バリデーション)が要求されています。具体的な方法はBS 7799(英国のJIS規格のような物、2000年に国際標準化)が作られた時(90年代後半)から記載されており、前の版までのISO 270001にも記載されています。2013年版のISO 27000ではセキュアプログラミングが普及したので具体的な方法などは省…

ホワイトリストの作り方

ホワイトリストの考え方/作り方は難しくありません。しかし、間違えていることが少なくないようです。 GoogleがCSP(Content Security Policy - ホワイトリスト型のJavaScriptインジェクション対策)の利用状況を調べたところ以下のような結果が得られました。 we take a closer look at the practi…

完全なSQLインジェクション対策

不完全なSQLインジェクション対策だけで、SQLインジェクション対策は万全、と誤解しているケースが少なくないです。 プリペアードクエリ/プレイスホルダを使ったSQLインジェクション対策でOK は誤りです。「とにかくプレイスホルダを使おう」では脆弱性は無くなりません。 簡単な証明:プリペアードクエリ”だけ”では、識別子(カラム/テーブル等)を使うソートクエリ、…