脆弱性と到達不能性
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2020/04/28 05:23 UTC 版)
「到達不能コード」の記事における「脆弱性と到達不能性」の解説
以下の例は、AppleによるTLS/SSLの実装上のバグであり、CVE番号として CVE-2014-1266 が与えられているほか、"goto fail bug" とも呼ばれている。実際のコードは以下の通りである。 static OSStatusSSLVerifySignedServerKeyExchange(SSLContext *ctx, bool isRsa, SSLBuffer signedParams, uint8_t *signature, UInt16 signatureLen){ OSStatus err; ... if ((err = SSLHashSHA1.update(&hashCtx, &serverRandom)) != 0) goto fail; if ((err = SSLHashSHA1.update(&hashCtx, &signedParams)) != 0) goto fail; goto fail; if ((err = SSLHashSHA1.final(&hashCtx, &hashOut)) != 0) goto fail; ... fail: SSLFreeBuffer(&signedHashes); SSLFreeBuffer(&hashCtx); return err;} goto fail;という文が2行連続している所がある。そして、2行目のほうのgoto文により、本来到達すべき final の呼び出しが到達不能コードとなっていて、final によるチェックが常にスキップされ、err は SHA1 update 操作の成功の後の値を保持することとなり、final による署名検証が行われない状態となっていた。 あきらかにこれは「到達不能コードによってセキュリティ上の脆弱性が齎された」のではない(到達不能コードは、一般に何もしない。それが何か悪さをしたと言えるのは、例えばコードサイズの増加であるとか、言語仕様で未定義なソースコードの記述を利用して実行させる、などした場合であろう)。真に「セキュリティ上の脆弱性を齎した」のは、「一見すると到達不能コードのように見えるためか、放置されたものと思われる、2行目のほうのgoto文(によって、到達されねばならないコードが到達不能になっていたこと)」である。教訓は「到達不能コードを放置するな。なぜなら、そういうコードの存在を見慣れるせいで、到達不能であってはいけないコードが到達不能になっていることを見逃す原因になるから」という点である。
※この「脆弱性と到達不能性」の解説は、「到達不能コード」の解説の一部です。
「脆弱性と到達不能性」を含む「到達不能コード」の記事については、「到達不能コード」の概要を参照ください。
- 脆弱性と到達不能性のページへのリンク