界: Environment
このセクションには、ソース コード以外のものでも、作成中の製品のセキュリティにとって重要なものがすべて含まれています。この分野が対象とする問題は、ソース コードに直接関係しないため、この分野の他の部分と分けました。
Insecure Compiler Optimization
Abstract
機密性の高いデータをメモリから不適切に消し去ると、セキュリティが危険にさらされます。
Explanation
次の場合にコンパイラ最適化エラーが発生します。
1. 機密データがメモリに格納されている場合。
2. 機密データが、内容を上書きすることによってメモリから消し去られる場合。
3. ソースコードが最適化コンパイラを使用してコンパイルされている場合。最適化コンパイラは、そのメモリがそれ以降使用されないという理由で、内容を上書きする関数を無駄な格納域と識別して削除します。
例 1: 次のコードでは、ユーザーからパスワードを読み込み、パスワードを使用してバックエンドのメインフレームに接続してから、
この例のコードは、逐語的に実行される場合は適切に動作しますが、コードが Microsoft Visual C++(R) .NET や GCC 3.x などの最適化コンパイラを使ってコンパイルされた場合、バッファ
攻撃者にシステムの機密事項がわからないように、メモリで操作されるパスワードや暗号鍵などの機密性が高いデータは上書きするのが普通です。しかし、最適化コンパイラを使用した場合、プログラムはソースコードのみが推奨する方法で常に動作するとは限りません。この例の場合、書き込み先のメモリがそれ以降使用されないため、明確にセキュリティ上の理由があるにも関わらず、コンパイラは
攻撃者は通常、このタイプの脆弱性を悪用して、コアダンプまたはランタイムメカニズムを利用し、特定のアプリケーションが使用するメモリにアクセスして機密情報を回復します。機密情報にアクセスした攻撃者は比較的簡単にさらにシステムを悪用することができ、アプリケーションとやり取りする他のリソースが危険にさらされるおそれがあります。
1. 機密データがメモリに格納されている場合。
2. 機密データが、内容を上書きすることによってメモリから消し去られる場合。
3. ソースコードが最適化コンパイラを使用してコンパイルされている場合。最適化コンパイラは、そのメモリがそれ以降使用されないという理由で、内容を上書きする関数を無駄な格納域と識別して削除します。
例 1: 次のコードでは、ユーザーからパスワードを読み込み、パスワードを使用してバックエンドのメインフレームに接続してから、
memset()
を使用してパスワードをメモリから消し去ろうと試みています。
void GetData(char *MFAddr) {
char pwd[64];
if (GetPasswordFromUser(pwd, sizeof(pwd))) {
if (ConnectToMainframe(MFAddr, pwd)) {
// Interaction with mainframe
}
}
memset(pwd, 0, sizeof(pwd));
}
この例のコードは、逐語的に実行される場合は適切に動作しますが、コードが Microsoft Visual C++(R) .NET や GCC 3.x などの最適化コンパイラを使ってコンパイルされた場合、バッファ
pwd
が値の上書き後に使用されないため、memset()
のコールは無駄な格納域として削除されます [2]。バッファ pwd
には機密性の高い値が含まれるため、データがメモリに常駐したままになるとアプリケーションが攻撃に対して脆弱になる場合があります。攻撃者がメモリの適切な領域にアクセスできる場合、パスワードを回復してシステムを制御できる可能性があります。攻撃者にシステムの機密事項がわからないように、メモリで操作されるパスワードや暗号鍵などの機密性が高いデータは上書きするのが普通です。しかし、最適化コンパイラを使用した場合、プログラムはソースコードのみが推奨する方法で常に動作するとは限りません。この例の場合、書き込み先のメモリがそれ以降使用されないため、明確にセキュリティ上の理由があるにも関わらず、コンパイラは
memset()
のコールを Dead Code と解釈しています。ここでの問題は、多くのコンパイラやプログラム言語では、効率の向上を目指すあまり、個別的なセキュリティ上の懸念材料が考慮に入れられていない点にあります。 攻撃者は通常、このタイプの脆弱性を悪用して、コアダンプまたはランタイムメカニズムを利用し、特定のアプリケーションが使用するメモリにアクセスして機密情報を回復します。機密情報にアクセスした攻撃者は比較的簡単にさらにシステムを悪用することができ、アプリケーションとやり取りする他のリソースが危険にさらされるおそれがあります。
References
[1] M. Howard Some Bad News and Some Good News Microsoft
[2] M. Howard, D. LeBlanc Writing Secure Code, Second Edition Microsoft Press
[3] Standards Mapping - Common Weakness Enumeration CWE ID 14
[4] Standards Mapping - DISA Control Correlation Identifier Version 2 CCI-001090
[5] Standards Mapping - FIPS200 MP
[6] Standards Mapping - General Data Protection Regulation (GDPR) Privacy Violation
[7] Standards Mapping - NIST Special Publication 800-53 Revision 4 SC-4 Information in Shared Resources (P1)
[8] Standards Mapping - NIST Special Publication 800-53 Revision 5 SC-4 Information in Shared System Resources
[9] Standards Mapping - OWASP Mobile 2014 M4 Unintended Data Leakage
[10] Standards Mapping - OWASP Mobile Application Security Verification Standard 2.0 MASVS-STORAGE-2
[11] Standards Mapping - OWASP Top 10 2004 A8 Insecure Storage
[12] Standards Mapping - OWASP Top 10 2007 A8 Insecure Cryptographic Storage
[13] Standards Mapping - OWASP Top 10 2010 A7 Insecure Cryptographic Storage
[14] Standards Mapping - OWASP Top 10 2013 A6 Sensitive Data Exposure
[15] Standards Mapping - OWASP Top 10 2017 A3 Sensitive Data Exposure
[16] Standards Mapping - OWASP Top 10 2021 A05 Security Misconfiguration
[17] Standards Mapping - Payment Card Industry Data Security Standard Version 1.1 Requirement 3.4, Requirement 6.5.8, Requirement 8.4
[18] Standards Mapping - Payment Card Industry Data Security Standard Version 1.2 Requirement 3.4, Requirement 6.3.1.3, Requirement 6.5.8, Requirement 8.4
[19] Standards Mapping - Payment Card Industry Data Security Standard Version 2.0 Requirement 3.4, Requirement 6.5.3, Requirement 8.4
[20] Standards Mapping - Payment Card Industry Data Security Standard Version 3.0 Requirement 3.4, Requirement 6.5.3, Requirement 8.2.1
[21] Standards Mapping - Payment Card Industry Data Security Standard Version 3.1 Requirement 3.4, Requirement 6.5.3, Requirement 8.2.1
[22] Standards Mapping - Payment Card Industry Data Security Standard Version 3.2 Requirement 3.4, Requirement 6.5.3, Requirement 8.2.1
[23] Standards Mapping - Payment Card Industry Data Security Standard Version 3.2.1 Requirement 3.4, Requirement 6.5.3, Requirement 8.2.1
[24] Standards Mapping - Payment Card Industry Data Security Standard Version 4.0 Requirement 3.5.1, Requirement 6.2.4, Requirement 8.3.1
[25] Standards Mapping - Payment Card Industry Data Security Standard Version 4.0.1 Requirement 3.3.2, Requirement 3.3.3, Requirement 3.5.1, Requirement 6.2.4, Requirement 8.3.1
[26] Standards Mapping - Payment Card Industry Software Security Framework 1.0 Control Objective 4.2 - Critical Asset Protection
[27] Standards Mapping - Payment Card Industry Software Security Framework 1.1 Control Objective 4.2 - Critical Asset Protection
[28] Standards Mapping - Payment Card Industry Software Security Framework 1.2 Control Objective 4.2 - Critical Asset Protection
[29] Standards Mapping - Security Technical Implementation Guide Version 3.1 APP3230.2 CAT II
[30] Standards Mapping - Security Technical Implementation Guide Version 3.4 APP3230.2 CAT II
[31] Standards Mapping - Security Technical Implementation Guide Version 3.5 APP3230.2 CAT II
[32] Standards Mapping - Security Technical Implementation Guide Version 3.6 APP3230.2 CAT II
[33] Standards Mapping - Security Technical Implementation Guide Version 3.7 APP3230.2 CAT II
[34] Standards Mapping - Security Technical Implementation Guide Version 3.9 APP3230.2 CAT II
[35] Standards Mapping - Security Technical Implementation Guide Version 3.10 APP3230.2 CAT II
[36] Standards Mapping - Security Technical Implementation Guide Version 4.2 APSC-DV-002380 CAT II
[37] Standards Mapping - Security Technical Implementation Guide Version 4.3 APSC-DV-002380 CAT II
[38] Standards Mapping - Security Technical Implementation Guide Version 4.4 APSC-DV-002380 CAT II
[39] Standards Mapping - Security Technical Implementation Guide Version 4.5 APSC-DV-002380 CAT II
[40] Standards Mapping - Security Technical Implementation Guide Version 4.6 APSC-DV-002380 CAT II
[41] Standards Mapping - Security Technical Implementation Guide Version 4.7 APSC-DV-002380 CAT II
[42] Standards Mapping - Security Technical Implementation Guide Version 4.8 APSC-DV-002380 CAT II
[43] Standards Mapping - Security Technical Implementation Guide Version 4.9 APSC-DV-002380 CAT II
[44] Standards Mapping - Security Technical Implementation Guide Version 4.10 APSC-DV-002380 CAT II
[45] Standards Mapping - Security Technical Implementation Guide Version 4.11 APSC-DV-002380 CAT II
[46] Standards Mapping - Security Technical Implementation Guide Version 4.1 APSC-DV-002380 CAT II
[47] Standards Mapping - Security Technical Implementation Guide Version 5.1 APSC-DV-002380 CAT II
[48] Standards Mapping - Security Technical Implementation Guide Version 5.2 APSC-DV-002380 CAT II
[49] Standards Mapping - Security Technical Implementation Guide Version 5.3 APSC-DV-002380 CAT II
[50] Standards Mapping - Security Technical Implementation Guide Version 6.1 APSC-DV-002380 CAT II
[51] Standards Mapping - Security Technical Implementation Guide Version 6.2 APSC-DV-002380 CAT II
desc.semantic.cpp.insecure_compiler_optimization