界: Input Validation and Representation

入力の検証や表現の問題は、メタキャラクター、代替エンコーディング、数値表現などによって引き起こされます。セキュリティの問題は、入力を信頼することに起因します。この問題に含まれるのは、「Buffer Overflow」、「Cross-Site Scripting」攻撃、「SQL Injection」などです。

175 見つかった項目
脆弱性
Abstract
Integer Overflow を考慮に入れないと、論理エラーまたは Buffer Overflow を引き起こす可能性があります。
Explanation
整数オーバーフロー エラーは、プログラムが算術演算の結果、データ型の最大値よりも大きいか、最小値よりも小さい量が得られるという事実を考慮していない場合に発生します。これらのエラーは、ユーザーの入力と、符号付きと符号なしの値の間の暗黙の変換が交差する、メモリ割り当て関数の問題をしばしば引き起こします。攻撃者がプログラムにメモリを過小に割り当てさせたり、メモリ操作で符号付きの値を符号なしの値として解釈させたりできる場合、プログラムがバッファオーバーフローの危険にさらされる可能性があります。

例 1: OpenSSH 3.3 から引用した次のコードは、Integer Overflow の典型的な例です。


nresp = packet_get_int();
if (nresp > 0) {
response = xmalloc(nresp*sizeof(char*));
for (i = 0; i < nresp; i++)
response[i] = packet_get_string(NULL);
}
nresp の値が 1073741824 であり、sizeof(char*) の通常の値が 4 の場合、処理 nresp*sizeof(char*) の結果はオーバーフローし、xmalloc() の引数は 0 になります。大部分の malloc() 実装では 0 バイトのバッファ割り当ても可能ですが、その後のループの反復処理でヒープ バッファ response のオーバーフローを引き起こします。

例 2: この例は、一連の変数長構造体に含まれるユーザー入力を処理しています。入力の先頭 2 バイトは、処理する構造体のサイズを記述しています。


char* processNext(char* strm) {
char buf[512];
short len = *(short*) strm;
strm += sizeof(len);
if (len <= 512) {
memcpy(buf, strm, len);
process(buf);
return strm + len;
} else {
return -1;
}
}


プログラマにより、構造体サイズの上限が設定されています。入力が 512 より大きい場合、処理は実行されません。問題は、len が符号付き整数であることです。構造体の最大長チェックは符号付き整数で行われますが、memcpy() のコールのために len は符号なしの整数に変換されます。len が負の場合、構造体のサイズは適切であるように見えますが (if 分岐が実行されます)、memcpy() によりコピーされたメモリ量は巨大になり、攻撃者は strm のデータでスタックをオーバーフローさせることが可能になります。
References
[1] blexim Basic Integer Overflows Phrack
[2] D. Plakosh Coding Flaws That Lead to Security Failures 2nd Annual Hampton University Information Assurance Symposium
[3] Les Hatton Safer C: Developing Software for High-integrity and Safety-critical Systems McGraw-Hill Companies
desc.dataflow.cpp.integer_overflow
Abstract
整数オーバーフローを考慮しないと、ロジック エラーまたはバッファ オーバーフローとなる可能性があります。
Explanation
整数オーバーフロー エラーは、プログラムが算術演算の結果、データ型の最大値よりも大きいか、最小値よりも小さい量が得られるという事実を考慮していない場合に発生します。これらのエラーは、ユーザーの入力と、符号付きと符号なしの値の間の暗黙の変換が交差する、メモリ割り当て関数の問題をしばしば引き起こします。攻撃者がプログラムにメモリを過小に割り当てさせたり、メモリ操作で符号付きの値を符号なしの値として解釈させたりできる場合、プログラムがバッファオーバーフローの危険にさらされる可能性があります。

例: 以下のコードの引用は、整数オーバーフローの典型的なケースを示しています。


77 accept-in PIC 9(10).
77 num PIC X(4) COMP-5. *> native 32-bit unsigned integer
77 mem-size PIC X(4) COMP-5.
...
ACCEPT accept-in
MOVE accept-in TO num
MULTIPLY 4 BY num GIVING mem-size

CALL "CBL_ALLOC_MEM" USING
mem-pointer
BY VALUE mem-size
BY VALUE 0
RETURNING status-code
END-CALL
num の値が 1073741824 である場合、操作 MULTIPLY 4 BY num の結果はオーバーフローし、malloc() に対する引数 mem-size0 になります。ほとんどの malloc() の実装は 0 バイト バッファの割り当てを許可するため、後続のステートメントでヒープ バッファ mem-pointer のオーバーフローが発生します。
References
[1] blexim Basic Integer Overflows Phrack
[2] D. Plakosh Coding Flaws That Lead to Security Failures 2nd Annual Hampton University Information Assurance Symposium
[3] Les Hatton Safer C: Developing Software for High-integrity and Safety-critical Systems McGraw-Hill Companies
desc.dataflow.cobol.integer_overflow
Abstract
関数が整数計算を誤って処理しているため、オーバーフロー/アンダーフローを招くおそれがあります。
Explanation
整数のオーバーフロー/アンダーフローは、計算または算術演算の結果が整数型の最大値を超えるか、最小値を下回る場合に発生し、これによって値が下限または上限にループバックしてそこから続行されます。算術演算の結果の値は、実際には上限/下限からの整数範囲の係数になります。

たとえば、ある数値が uint256 型で格納されている場合、これは 0 ~ 2^256-1 の範囲の 256 ビット符号なし整数で格納されていることを意味します。算術演算の結果が上限を超える数値になる場合、オーバーフローが発生し、開始値 (0) から余りが加算されます。算術演算により数値が下限を下回る場合、アンダーフローが発生し、最大値 (2^256-1) から余りが減算されます。

例 1: 次のパブリック関数は、整数のオーバーフロー/アンダーフローを引き起こし、マップ内の意図しないインデックスに影響を与える可能性がある算術演算を使用して uint256 マッピングを更新します。


contract overflow {
mapping(uint256 => uint256) map;

function init(uint256 k, uint256 v) public {
map[k] -= v;
}
}
References
[1] Enterprise Ethereum Alliance No Overflow/Underflow
desc.structural.solidity.swc101
Abstract
ユーザー入力でインテント パラメータを制御できるようにすると、攻撃者が後続のアクティビティの動作を制御できるようになる可能性があります。
Explanation
意図的操作の問題が発生するのは、次の 2 つの条件に一致した場合です。

1. 攻撃者が Android インテントのアクション、クラス名、またはコンポーネントを指定できる場合。

たとえば、攻撃者がクラス名またはコンポーネントを指定してインテントを処理できる可能性があります。

2. アクション、クラス名、またはコンポーネントを指定することにより、攻撃者が通常では許可されない権限を取得する場合。

たとえば、プログラムにより、デバイス上のサードパーティ ソフトウェアに機密性が高い情報を送信する権限が攻撃者に与えられる可能性があります。

例 1: 次のコードは、HTTP リクエストから読み取った引数を使用して、インテントのクラス名を設定します。


String arg = request.getParameter("arg");
...
Intent intent = new Intent();
...
intent.setClassName(arg);
ctx.startActivity(intent);
...
References
[1] Intent
desc.dataflow.java.intent_manipulation
Abstract
外部入力からネスト化された Intent を使用してアクティビティを開始し、サービスを開始し、ブロードキャストを配信すると、攻撃者は内部アプリケーション コンポーネントを自由に起動し、内部コンポーネントの振る舞いを制御し、一時的な権限許可を通してコンテンツ プロバイダーから保護データに間接的にアクセスできるようになる可能性があります。
Explanation
Redirection intent manipulation の問題が発生するのは、次の条件に一致した場合です。
1.エクスポートされたコンポーネントは、外部提供による Intent の Extras Bundle にネスト化された任意の Intent を受け入れます。

2.エクスポートされたコンポーネントは、startActivitystartService、または sendBroadcast を呼び出すことで、任意の Intent を使用してコンポーネントを起動します。

攻撃者は、これらの条件が存在する場合、本来は許可されなかったはずの権限を取得できる可能性があります。
例 1: 次のコードでは、外部ソースからのネスト化された Intent を受け入れ、その Intent を使用してアクティビティを開始しています。


...
Intent nextIntent = (Intent) getIntent().getParcelableExtra("next-intent");
startActivity(nextIntent);
...
References
[1] Intent
[2] Remediation for Intent Redirection Vulnerability - Google Help
[3] Nicole Borrelli Android Nesting Intents
[4] Standards Mapping - CIS Azure Kubernetes Service Benchmark 3
[5] Standards Mapping - CIS Microsoft Azure Foundations Benchmark complete
[6] Standards Mapping - CIS Amazon Elastic Kubernetes Service Benchmark 4
[7] Standards Mapping - CIS Amazon Web Services Foundations Benchmark 1
[8] Standards Mapping - CIS Google Kubernetes Engine Benchmark integrity
[9] Standards Mapping - CIS Kubernetes Benchmark partial
[10] Standards Mapping - Common Weakness Enumeration CWE ID 99
[11] Standards Mapping - DISA Control Correlation Identifier Version 2 CCI-002754
[12] Standards Mapping - FIPS200 SI
[13] Standards Mapping - General Data Protection Regulation (GDPR) Indirect Access to Sensitive Data
[14] Standards Mapping - NIST Special Publication 800-53 Revision 4 SI-10 Information Input Validation (P1)
[15] Standards Mapping - NIST Special Publication 800-53 Revision 5 SI-10 Information Input Validation
[16] Standards Mapping - OWASP Top 10 2004 A1 Unvalidated Input
[17] Standards Mapping - OWASP Top 10 2007 A4 Insecure Direct Object Reference
[18] Standards Mapping - OWASP Top 10 2010 A4 Insecure Direct Object References
[19] Standards Mapping - OWASP Top 10 2013 A4 Insecure Direct Object References
[20] Standards Mapping - OWASP Top 10 2017 A5 Broken Access Control
[21] Standards Mapping - OWASP Top 10 2021 A01 Broken Access Control
[22] Standards Mapping - OWASP API 2023 API2 Broken Authentication
[23] Standards Mapping - OWASP Mobile 2014 M8 Security Decisions Via Untrusted Inputs
[24] Standards Mapping - OWASP Mobile 2024 M4 Insufficient Input/Output Validation
[25] Standards Mapping - OWASP Mobile Application Security Verification Standard 2.0 MASVS-CODE-4, MASVS-PLATFORM-1
[26] Standards Mapping - Payment Card Industry Data Security Standard Version 1.1 Requirement 6.5.1
[27] Standards Mapping - Payment Card Industry Data Security Standard Version 1.2 Requirement 6.3.1.1, Requirement 6.5.4
[28] Standards Mapping - Payment Card Industry Data Security Standard Version 2.0 Requirement 6.5.8
[29] Standards Mapping - Payment Card Industry Data Security Standard Version 3.0 Requirement 6.5.8
[30] Standards Mapping - Payment Card Industry Data Security Standard Version 3.2 Requirement 6.5.8
[31] Standards Mapping - Payment Card Industry Data Security Standard Version 3.2.1 Requirement 6.5.8
[32] Standards Mapping - Payment Card Industry Data Security Standard Version 3.1 Requirement 6.5.8
[33] Standards Mapping - Payment Card Industry Data Security Standard Version 4.0 Requirement 6.2.4
[34] Standards Mapping - Payment Card Industry Software Security Framework 1.0 Control Objective 4.2 - Critical Asset Protection, Control Objective 5.4 - Authentication and Access Control
[35] Standards Mapping - Payment Card Industry Software Security Framework 1.1 Control Objective 4.2 - Critical Asset Protection, Control Objective 5.4 - Authentication and Access Control, Control Objective B.3.1 - Terminal Software Attack Mitigation, Control Objective B.3.1.1 - Terminal Software Attack Mitigation
[36] Standards Mapping - Payment Card Industry Software Security Framework 1.2 Control Objective 4.2 - Critical Asset Protection, Control Objective 5.4 - Authentication and Access Control, Control Objective B.3.1 - Terminal Software Attack Mitigation, Control Objective B.3.1.1 - Terminal Software Attack Mitigation, Control Objective C.2.3 - Web Software Access Controls, Control Objective C.3.2 - Web Software Attack Mitigation
[37] Standards Mapping - Security Technical Implementation Guide Version 3.1 APP3510 CAT I, APP3600 CAT II
[38] Standards Mapping - Security Technical Implementation Guide Version 3.4 APP3510 CAT I, APP3600 CAT II
[39] Standards Mapping - Security Technical Implementation Guide Version 3.5 APP3510 CAT I, APP3600 CAT II
[40] Standards Mapping - Security Technical Implementation Guide Version 3.6 APP3510 CAT I, APP3600 CAT II
[41] Standards Mapping - Security Technical Implementation Guide Version 3.7 APP3510 CAT I, APP3600 CAT II
[42] Standards Mapping - Security Technical Implementation Guide Version 3.9 APP3510 CAT I, APP3600 CAT II
[43] Standards Mapping - Security Technical Implementation Guide Version 3.10 APP3510 CAT I, APP3600 CAT II
[44] Standards Mapping - Security Technical Implementation Guide Version 4.1 APSC-DV-002560 CAT I
[45] Standards Mapping - Security Technical Implementation Guide Version 4.2 APSC-DV-002560 CAT I
[46] Standards Mapping - Security Technical Implementation Guide Version 4.3 APSC-DV-002560 CAT I
[47] Standards Mapping - Security Technical Implementation Guide Version 4.4 APSC-DV-002560 CAT I
[48] Standards Mapping - Security Technical Implementation Guide Version 4.5 APSC-DV-002560 CAT I
[49] Standards Mapping - Security Technical Implementation Guide Version 4.6 APSC-DV-002560 CAT I
[50] Standards Mapping - Security Technical Implementation Guide Version 4.7 APSC-DV-002560 CAT I
[51] Standards Mapping - Security Technical Implementation Guide Version 4.8 APSC-DV-002560 CAT I
[52] Standards Mapping - Security Technical Implementation Guide Version 4.9 APSC-DV-002560 CAT I
[53] Standards Mapping - Security Technical Implementation Guide Version 4.10 APSC-DV-002560 CAT I
[54] Standards Mapping - Security Technical Implementation Guide Version 4.11 APSC-DV-002560 CAT I
[55] Standards Mapping - Security Technical Implementation Guide Version 5.1 APSC-DV-002560 CAT I
[56] Standards Mapping - Security Technical Implementation Guide Version 5.2 APSC-DV-002560 CAT I
[57] Standards Mapping - Security Technical Implementation Guide Version 5.3 APSC-DV-002530 CAT II, APSC-DV-002560 CAT I
[58] Standards Mapping - Web Application Security Consortium Version 2.00 Improper Input Handling (WASC-20)
desc.dataflow.java.intent_manipulation_redirection
Abstract
このメソッドは未検証の入力を JSON に書き込みます。このコールにより、攻撃者は任意の要素や属性を JSON エンティティに挿入する可能性があります。
Explanation
次の場合に JSO Injection が発生します。

1. 信頼できないソースからデータがプログラムに入り込んだ場合。


2. データが JSON ストリームに書き込まれた場合。

アプリケーションは、通常、JSON を使用してデータを保存したりメッセージを送信したりします。データの保存に使用される場合、JSON はキャッシュ保存されたデータのように扱われ、重要な情報が含まれる場合があります。メッセージの送信に使用される場合、JSON は多くの場合 RESTful サービスと一緒に使用され、認証情報のような機密情報の送信に使用される可能性があります。

アプリケーションが検証されていない入力から JSON を構成する場合、JSON 文書およびメッセージのセマンティクスが改変される場合があります。比較的良性の場合、攻撃者は、JSON 文書またはリクエストをパース中にアプリケーションに例外をスローさせる、余分な要素を挿入できるようになることがあります。JSON Injection を含むなど、より深刻な場合、攻撃者は、JSON 文書またはリクエスト内でビジネスに不可欠な値の予測可能な操作を許可する、余分な要素を挿入できるようになることがあります。また、JSON Injection により、Cross-Site Scripting や Dynamic Code Evaluation が引き起こされる場合もあります。

例 1: 次の C# コードは JSON.NET を使用して、ユーザー制御入力変数 username および password から C:\user_info.json にある JSON ファイルに、権限を与えられていないユーザー (「default」ロールのユーザーです。これに対し権限が付与されたユーザーのロールは「admin」です) のユーザー アカウントの認証情報をシリアライズします。


...

StringBuilder sb = new StringBuilder();
StringWriter sw = new StringWriter(sb);

using (JsonWriter writer = new JsonTextWriter(sw))
{
writer.Formatting = Formatting.Indented;

writer.WriteStartObject();

writer.WritePropertyName("role");
writer.WriteRawValue("\"default\"");

writer.WritePropertyName("username");
writer.WriteRawValue("\"" + username + "\"");

writer.WritePropertyName("password");
writer.WriteRawValue("\"" + password + "\"");

writer.WriteEndObject();
}

File.WriteAllText(@"C:\user_info.json", sb.ToString());


ただし、JSON シリアライゼーションが JsonWriter.WriteRawValue() を使用して実行されるため、username および password 内の信頼できないデータに対して、JSON 関連の特殊文字をエスケープするための検証がされなくなります。これにより、ユーザーが、シリアライズされた JSON の構造を変更する可能性がある JSON キーを随意に挿入できるようになります。この例では、権限を与えられていないユーザー mallory (パスワード Evil123!) が username 変数の値を設定するプロンプトでユーザー名を入力するときに自身のユーザー名に ","role":"admin を追加する場合、結果として C:\user_info.json に保存される JSON は次のようになります。


{
"role":"default",
"username":"mallory",
"role":"admin",
"password":"Evil123!"
}


このシリアライズされた JSON ファイルがその後 JsonConvert.DeserializeObject() を使用して Dictionary オブジェクトにデシリアライズされた場合はこのようになります。


String jsonString = File.ReadAllText(@"C:\user_info.json");

Dictionary<string, string> userInfo = JsonConvert.DeserializeObject<Dictionary<string, strin>>(jsonString);
Dictionary オブジェクト内で usernamepassword、および role キーの結果として得られる値はそれぞれ malloryEvil123!、および admin になります。デシリアライズされた JSON 値が有効かについてこれ以上検証しないと、アプリケーションは誤ってユーザー mallory に「admin」権限を割り当てます。
desc.dataflow.dotnet.json_injection
Abstract
このメソッドは未検証の入力を JSON に書き込みます。攻撃者は任意の要素や属性を JSON エンティティに挿入する可能性があります。
Explanation
次の場合に JSO Injection が発生します。

1.信頼できないソースからデータがプログラムに入力された場合。


2.データが JSON ストリームに書き込まれた場合。

アプリケーションは、通常、JSON を使用してデータを保存したりメッセージを送信したりします。データの保存に使用される場合、JSON はキャッシュ保存されたデータのように扱われ、重要な情報が含まれる場合があります。メッセージの送信に使用される場合、JSON は多くの場合 RESTful サービスと一緒に使用され、認証情報のような機密情報を送信する可能性があります。

アプリケーションが検証されていない入力から JSON を構成する場合、JSON 文書およびメッセージのセマンティクスが改変される場合があります。比較的良性の場合、攻撃者は、JSON 文書またはリクエストをパース中にアプリケーションに例外をスローさせる、余分な要素を挿入できるようになることがあります。JSON Injection を含むなど、より深刻な場合、攻撃者は、JSON 文書またはリクエスト内でビジネスに不可欠な値の予測可能な操作を許可する、余分な要素を挿入できるようになることがあります。また、JSON Injection により、Cross-Site Scripting や Dynamic Code Evaluation が引き起こされる場合もあります。

例 1: 次のコードは、ユーザー制御入力変数 username および password から ~/user_info.json にある JSON ファイルに、権限を与えられていないユーザー (「default」ロールのユーザーです。これに対し権限が付与されたユーザーのロールは「admin」です) のユーザー アカウントの認証情報をシリアライズします。


...
func someHandler(w http.ResponseWriter, r *http.Request){
r.parseForm()
username := r.FormValue("username")
password := r.FormValue("password")
...
jsonString := `{
"username":"` + username + `",
"role":"default"
"password":"` + password + `",
}`
...
f, err := os.Create("~/user_info.json")
defer f.Close()

jsonEncoder := json.NewEncoder(f)
jsonEncoder.Encode(jsonString)
}


ただし、JSON シリアライゼーションが文字列連結を使用して実行されるため、username および password 内の信頼できないデータに対して、JSON 関連の特殊文字をエスケープするための検証がされなくなります。これにより、ユーザーが、シリアライズされた JSON の構造を変更する可能性がある JSON キーを随意に挿入できるようになります。この例では、権限を与えられていないユーザー mallory (パスワード Evil123!) がユーザー名を入力するときに ","role":"admin を追加する場合、結果として ~/user_info.json に保存される JSON は次のようになります。


{
"username":"mallory",
"role":"default",
"password":"Evil123!",
"role":"admin"
}

デシリアライズされた JSON 値が有効かどうかこれ以上検証しないと、アプリケーションは意図せずユーザー mallory に「admin」権限を割り当てます。
desc.dataflow.golang.json_injection
Abstract
このメソッドは未検証の入力を JSON に書き込みます。このコールにより、攻撃者は任意の要素や属性を JSON エンティティに挿入する可能性があります。
Explanation
次の場合に JSO Injection が発生します。

1. 信頼できないソースからデータがプログラムに入り込んだ場合。


2. データが JSON ストリームに書き込まれた場合。

アプリケーションは、通常、JSON を使用してデータを保存したりメッセージを送信したりします。データの保存に使用される場合、JSON はキャッシュ保存されたデータのように扱われ、重要な情報が含まれる場合があります。メッセージの送信に使用される場合、JSON は多くの場合 RESTful サービスと一緒に使用され、認証情報のような機密情報の送信に使用される可能性があります。

アプリケーションが検証されていない入力から JSON を構成する場合、JSON 文書およびメッセージのセマンティクスが改変される場合があります。比較的良性の場合、攻撃者は、JSON 文書またはリクエストをパース中にアプリケーションに例外をスローさせる、余分な要素を挿入できるようになることがあります。JSON Injection を含むなど、より深刻な場合、攻撃者は、JSON 文書またはリクエスト内でビジネスに不可欠な値の予測可能な操作を許可する、余分な要素を挿入できるようになることがあります。また、JSON Injection により、Cross-Site Scripting や Dynamic Code Evaluation が引き起こされる場合もあります。

例 1: 次の Java コードは Jackson を使用して、ユーザー制御入力変数 username および password から ~/user_info.json にある JSON ファイルに、権限を与えられていないユーザー (「default」ロールのユーザーです。これに対し権限が付与されたユーザーのロールは「admin」です) のユーザーアカウントの認証情報をシリアライズします。


...

JsonFactory jfactory = new JsonFactory();

JsonGenerator jGenerator = jfactory.createJsonGenerator(new File("~/user_info.json"), JsonEncoding.UTF8);

jGenerator.writeStartObject();

jGenerator.writeFieldName("username");
jGenerator.writeRawValue("\"" + username + "\"");

jGenerator.writeFieldName("password");
jGenerator.writeRawValue("\"" + password + "\"");

jGenerator.writeFieldName("role");
jGenerator.writeRawValue("\"default\"");

jGenerator.writeEndObject();

jGenerator.close();


ただし、JSON シリアライゼーションが JsonGenerator.writeRawValue() を使用して実行されるため、username および password 内の信頼できないデータに対して、JSON 関連の特殊文字をエスケープするための検証がされなくなります。これにより、ユーザーが、シリアライズされた JSON の構造を変更する可能性がある JSON キーを随意に挿入できるようになります。この例では、権限を与えられていないユーザー mallory (パスワード Evil123!) が username 変数の値を設定するプロンプトでユーザー名を入力するときに自身のユーザー名に ","role":"admin を追加する場合、結果として ~/user_info.json に保存される JSON は次のようになります。


{
"username":"mallory",
"role":"admin",
"password":"Evil123!",
"role":"default"
}


このシリアライズされた JSON ファイルがその後 JsonParser を使用して HashMap オブジェクトにデシリアライズされた場合はこのようになります。


JsonParser jParser = jfactory.createJsonParser(new File("~/user_info.json"));

while (jParser.nextToken() != JsonToken.END_OBJECT) {

String fieldname = jParser.getCurrentName();

if ("username".equals(fieldname)) {
jParser.nextToken();
userInfo.put(fieldname, jParser.getText());
}

if ("password".equals(fieldname)) {
jParser.nextToken();
userInfo.put(fieldname, jParser.getText());
}

if ("role".equals(fieldname)) {
jParser.nextToken();
userInfo.put(fieldname, jParser.getText());
}

if (userInfo.size() == 3)
break;
}

jParser.close();
HashMap オブジェクト内で usernamepassword、および role キーの結果として得られる値はそれぞれ malloryEvil123!、および admin になります。デシリアライズされた JSON 値が有効かについてこれ以上検証しないと、アプリケーションは誤ってユーザー mallory に「admin」権限を割り当てます。
desc.dataflow.java.json_injection
Abstract
このメソッドは未検証の入力を JSON に書き込みます。このコールにより、攻撃者は任意の要素や属性を JSON エンティティに挿入する可能性があります。
Explanation
次の場合に JSO Injection が発生します。

1. 信頼できないソースからデータがプログラムに入り込んだ場合。


2. データが JSON ストリームに書き込まれた場合。

アプリケーションは、通常、JSON を使用してデータを保存したりメッセージを送信したりします。データの保存に使用される場合、JSON はキャッシュ保存されたデータのように扱われ、重要な情報が含まれる場合があります。メッセージの送信に使用される場合、JSON は多くの場合 RESTful サービスと一緒に使用され、認証情報のような機密情報の送信に使用される可能性があります。

アプリケーションが検証されていない入力から JSON を構成する場合、JSON 文書およびメッセージのセマンティクスが改変される場合があります。比較的良性の場合、攻撃者は、JSON 文書またはリクエストをパース中にアプリケーションに例外をスローさせる、余分な要素を挿入できるようになることがあります。JSON Injection を含むなど、より深刻な場合、攻撃者は、JSON 文書またはリクエスト内でビジネスに不可欠な値の予測可能な操作を許可する、余分な要素を挿入できるようになることがあります。また、JSON Injection により、Cross-Site Scripting や Dynamic Code Evaluation が引き起こされる場合もあります。

例 1: 次の JavaScript コードでは、jQuery を使用して URL から値を受け取る JSON をパースしています。


var str = document.URL;
var url_check = str.indexOf('name=');
var name = null;
if (url_check > -1) {
name = decodeURIComponent(str.substring((url_check+5), str.length));
}

$(document).ready(function(){
if (name !== null){
var obj = jQuery.parseJSON('{"role": "user", "name" : "' + name + '"}');
...
}
...
});


ここで、name で信頼されていないデータは検証されずに JSON 関連の特殊文字がエスケープされません。これにより、ユーザーが、シリアライズされた JSON の構造を変更する可能性がある JSON キーを随意に挿入できるようになります。この例では、権限のないユーザー mallory が URL の名前パラメーターに ","role":"admin を追加すると、JSON は次のようになります。


{
"role":"user",
"username":"mallory",
"role":"admin"
}


これは jQuery.parseJSON() によってパースされてプレーン オブジェクトに設定されます。つまり、obj.role は "user" の代わりに "admin" を返すようになります。
desc.dataflow.javascript.json_injection
Abstract
このメソッドは未検証の入力を JSON に書き込みます。このコールにより、攻撃者は任意の要素や属性を JSON エンティティに挿入する可能性があります。
Explanation
次の場合に JSO Injection が発生します。

1. 信頼できないソースからデータがプログラムに入り込んだ場合。


2. データが JSON ストリームに書き込まれた場合。

アプリケーションは、通常、JSON を使用してデータを保存したりメッセージを送信したりします。データの保存に使用される場合、JSON はキャッシュ保存されたデータのように扱われ、重要な情報が含まれる場合があります。メッセージの送信に使用される場合、JSON は多くの場合 RESTful サービスと一緒に使用され、認証情報のような機密情報の送信に使用される可能性があります。

アプリケーションが検証されていない入力から JSON を構成する場合、JSON 文書およびメッセージのセマンティクスが改変される場合があります。比較的良性の場合、攻撃者は、JSON 文書またはリクエストをパース中にアプリケーションに例外をスローさせる、余分な要素を挿入できるようになることがあります。JSON Injection を含むなど、より深刻な場合、攻撃者は、JSON 文書またはリクエスト内でビジネスに不可欠な値の予測可能な操作を許可する、余分な要素を挿入できるようになることがあります。また、JSON Injection により、Cross-Site Scripting や Dynamic Code Evaluation が引き起こされる場合もあります。

例 1: 次の Objective-C コードは、ユーザー制御が可能なフィールド _usernameField および _passwordField から JSON に、権限を与えられていないユーザー (「default」ロールのユーザーです。これに対し権限が付与されたユーザーのロールは「admin」です) のユーザー アカウントの認証情報をシリアライズします。


...

NSString * const jsonString = [NSString stringWithFormat: @"{\"username\":\"%@\",\"password\":\"%@\",\"role\":\"default\"}" _usernameField.text, _passwordField.text];


ただし、JSON シリアライゼーションが NSString.stringWithFormat: を使用して実行されるため、_usernameField および _passwordField 内の信頼できないデータに対して、JSON 関連の特殊文字をエスケープするための検証がされなくなります。これにより、ユーザーが、シリアライズされた JSON の構造を変更する可能性がある JSON キーを随意に挿入できるようになります。この例では、権限を与えられていないユーザー mallory (パスワード Evil123!) がユーザー名を _usernameField フィールドに入力するときに自身のユーザー名に ","role":"admin を追加する場合、結果として JSON は次のようになります。


{
"username":"mallory",
"role":"admin",
"password":"Evil123!",
"role":"default"
}


このシリアライズされた JSON 文字列がその後 NSJSONSerialization.JSONObjectWithData: を使用して NSDictionary オブジェクトにデシリアライズされた場合はこのようになります。


NSError *error;
NSDictionary *jsonData = [NSJSONSerialization JSONObjectWithData:[jsonString dataUsingEncoding:NSUTF8StringEncoding] options:NSJSONReadingAllowFragments error:&error];
NSDictionary オブジェクト内で usernamepassword、および role キーの結果として得られる値はそれぞれ malloryEvil123!、および admin になります。デシリアライズされた JSON 値が有効かについてこれ以上検証しないと、アプリケーションは誤ってユーザー mallory に「admin」権限を割り当てます。
desc.dataflow.objc.json_injection
Abstract
このメソッドは未検証の入力を JSON に書き込みます。この呼び出しにより、攻撃者は任意の要素や属性を JSON エンティティに挿入する可能性があります。
Explanation
次の場合に JSON Injection が発生します。

1.信頼できないソースからデータがプログラムに入力された場合。


2.データが JSON ストリームに書き込まれた場合。

アプリケーションは、通常、JSON を使用してデータを保存したりメッセージを送信したりします。データの保存に使用される場合、JSON はキャッシュ保存されたデータのように扱われ、重要な情報が含まれる場合があります。メッセージの送信に使用される場合、JSON は多くの場合 RESTful サービスと一緒に使用され、認証情報のような機密情報の送信に使用される可能性があります。

アプリケーションが未検証の入力から JSON を構築すると、JSON ドキュメントとメッセージのセマンティクスは変更される可能性があります。深刻でないとしても、攻撃者が余分な要素を挿入し、JSON ドキュメントまたはリクエストを解析中に、アプリケーションに例外をスローさせる可能性があります。深刻なケース (JSON Injection が伴う場合など) としては、攻撃者が、JSON ドキュメントまたはリクエスト内に、ビジネス上不可欠な値の予測可能な操作を許可する余分な要素を挿入することがあります。また、JSON Injection が Cross-Site Scripting や Dynamic Code Evaluation を引き起こす場合があります。

例: 次の Python コードは、URL から取得された、信頼できない値で json ファイルを更新します。


import json
import requests
from urllib.parse import urlparse
from urllib.parse import parse_qs

url = 'https://www.example.com/some_path?name=some_value'
parsed_url = urlparse(url)
untrusted_values = parse_qs(parsed_url.query)['name'][0]

with open('data.json', 'r') as json_File:
data = json.load(json_File)

data['name']= untrusted_values

with open('data.json', 'w') as json_File:
json.dump(data, json_File)

...
name 内の信頼できないデータに対して、JSON 関連の特殊文字をエスケープするための検証がされなくなります。これにより、ユーザーが JSON キーを随意に挿入できるようになり、シリアライズされた JSON の構造を変更する可能性があります。この例では、権限を与えられていないユーザー mallory が URL の名前パラメータに ","role":"admin を追加する場合、JSON は次のようになります。


{
"role":"user",
"username":"mallory",
"role":"admin"
}

これで、JSON ファイルは悪意のあるデータで改ざんされ、ユーザーは "user" ではなく "admin" の特権付きアクセス権を使用できるようになりました
desc.dataflow.python.json_injection
Abstract
このメソッドは未検証の入力を JSON に書き込みます。このコールにより、攻撃者は任意の要素や属性を JSON エンティティに挿入する可能性があります。
Explanation
次の場合に JSO Injection が発生します。

1.信頼できないソースからデータがプログラムに入り込んだ場合。


2.データが JSON ストリームに書き込まれた場合。

アプリケーションは、通常、JSON を使用してデータを保存したりメッセージを送信したりします。データの保存に使用される場合、JSON はキャッシュ保存されたデータのように扱われ、重要な情報が含まれる場合があります。メッセージの送信に使用される場合、JSON は多くの場合 RESTful サービスと一緒に使用され、認証情報のような機密情報の送信に使用される可能性があります。

アプリケーションが検証されていない入力から JSON を構成する場合、JSON 文書およびメッセージのセマンティクスが改変される場合があります。比較的良性の場合、攻撃者は、JSON 文書またはリクエストをパース中にアプリケーションに例外をスローさせる、余分な要素を挿入できるようになることがあります。JSON Injection を含むなど、より深刻な場合、攻撃者は、JSON 文書またはリクエスト内でビジネスに不可欠な値の予測可能な操作を許可する、余分な要素を挿入できるようになることがあります。また、JSON Injection により、Cross-Site Scripting や Dynamic Code Evaluation が引き起こされる場合もあります。
desc.dataflow.scala.json_injection
Abstract
このメソッドは未検証の入力を JSON に書き込みます。このコールにより、攻撃者は任意の要素や属性を JSON エンティティに挿入する可能性があります。
Explanation
次の場合に JSO Injection が発生します。

1. 信頼できないソースからデータがプログラムに入り込んだ場合。


2. データが JSON ストリームに書き込まれた場合。

アプリケーションは、通常、JSON を使用してデータを保存したりメッセージを送信したりします。データの保存に使用される場合、JSON はキャッシュ保存されたデータのように扱われ、重要な情報が含まれる場合があります。メッセージの送信に使用される場合、JSON は多くの場合 RESTful サービスと一緒に使用され、認証情報のような機密情報の送信に使用される可能性があります。

アプリケーションが検証されていない入力から JSON を構成する場合、JSON 文書およびメッセージのセマンティクスが改変される場合があります。比較的良性の場合、攻撃者は、JSON 文書またはリクエストをパース中にアプリケーションに例外をスローさせる、余分な要素を挿入できるようになることがあります。JSON Injection を含むなど、より深刻な場合、攻撃者は、JSON 文書またはリクエスト内でビジネスに不可欠な値の予測可能な操作を許可する、余分な要素を挿入できるようになることがあります。また、JSON Injection により、Cross-Site Scripting や Dynamic Code Evaluation が引き起こされる場合もあります。

例 1: 次の Swift コードは、ユーザー制御が可能なフィールド usernameField および passwordField から JSON に、権限を与えられていないユーザー (「default」ロールのユーザーです。これに対し権限が付与されたユーザーのロールは「admin」です) のユーザー アカウントの認証情報をシリアライズします。


...
let jsonString : String = "{\"username\":\"\(usernameField.text)\",\"password\":\"\(passwordField.text)\",\"role\":\"default\"}"


ただし、JSON シリアライゼーションが文字列補間を使用して実行されるため、usernameField および passwordField 内の信頼できないデータに対して、JSON 関連の特殊文字をエスケープするための検証がされなくなります。これにより、ユーザーが、シリアライズされた JSON の構造を変更する可能性がある JSON キーを随意に挿入できるようになります。この例では、権限を与えられていないユーザー mallory (パスワード Evil123!) がユーザー名を usernameField フィールドに入力するときに自身のユーザー名に ","role":"admin を追加する場合、結果として JSON は次のようになります。


{
"username":"mallory",
"role":"admin",
"password":"Evil123!",
"role":"default"
}


このシリアライズされた JSON 文字列がその後 NSJSONSerialization.JSONObjectWithData: を使用して NSDictionary オブジェクトにデシリアライズされた場合はこのようになります。


var error: NSError?
var jsonData : NSDictionary = NSJSONSerialization.JSONObjectWithData(jsonString.dataUsingEncoding(NSUTF8StringEncoding), options: NSJSONReadingOptions.MutableContainers, error: &error) as NSDictionary
NSDictionary オブジェクト内で usernamepassword、および role キーの結果として得られる値はそれぞれ malloryEvil123!、および admin になります。デシリアライズされた JSON 値が有効かについてこれ以上検証しないと、アプリケーションは誤ってユーザー mallory に「admin」権限を割り当てます。
desc.dataflow.swift.json_injection
Abstract
アプリケーションは、信頼できないデータを使用して JSON クエリを実行するため、攻撃者によって JSON ドキュメントの予期しない部分がクエリされる可能性があります。
Explanation
「JSON Path」を使用すると、開発者は XPath で XML 文書をクエリするのと同様の方法で JSON 文書をクエリできます。 クエリをアセンブルするために使用するキーを任意に選択できるので、ユーザーはドキュメントの予期しない異なる部分をクエリでき、個人データや機密データにアクセスする可能性があります。

例 1: 次のコードでは、ユーザー定義のキーワードを使用して、名前や住所などのパブリック ユーザーの詳細を含む JSON ドキュメントにアクセスしますが、この JSON ドキュメントにはユーザーのパスワードといった個人情報も含まれています。


def searchUserDetails(key:String) = Action.async { implicit request =>
val user_json = getUserDataFor(user)
val value = (user_json \ key).get.as[String]
...
}
key はユーザーによって制御可能であるため、悪意のあるユーザーはこれを利用して、ユーザーのパスワードなど JSON ドキュメントに含まれる他の個人データにアクセスすることができます。
desc.dataflow.scala.json_path_manipulation
Abstract
オブジェクトを返す LDAP 検索を実行するアプリケーションは、LDAP レスポンスを制御して、サーバー上で任意のコードを実行するチャンスを攻撃者に与える可能性があります。
Explanation
攻撃者は、保存中のエントリを変更するか、オンザフライでレスポンスを傍受して変更する (man-in-the-middle 攻撃) ことで、LDAP レスポンスを改ざんし、LDAP エントリに特別な Java 属性を挿入できます。オブジェクトを返す検索を実行する場合、Java 属性は Java デシリアライゼーションまたは JNDI 間接参照を使用して Java オブジェクトとしてデコードされるため、攻撃者は検索を実行するアプリケーション サーバーでリモートコードを実行できます。

アプリケーションは、search メソッドに渡された javax.naming.directory.SearchControls インスタンスで returningObjectFlagtrue に設定するか、代わりにこのフラグを設定するライブラリ関数を使用することで、オブジェクトを返す検索を実行します。

この場合、アプリケーションはオブジェクトを返す検索を実行する Spring Security LDAP 認証モジュールを使用しているため、LDAP エントリ ポイズニングに対して脆弱です。

例: 次の Bean 構成ファイルでは、アプリケーションで認証プロバイダとして Spring Security LDAP モジュールが使用されるように構成されます。


<beans ... >
<authentication-manager>
<ldap-authentication-provider
user-search-filter="(uid={0})"
user-search-base="ou=users,dc=example,dc=org"
group-search-filter="(uniqueMember={0})"
group-search-base="ou=groups,dc=example,dc=org"
group-role-attribute="cn"
role-prefix="ROLE_">
</ldap-authentication-provider>
</authentication-manager>
</beans>
References
[1] Introducing JNDI Injection and LDAP Entry Poisoning OpenText Fortify
[2] A Journey from JNDI/LDAP manipulation to remote code execution dream land BlackHat
desc.configuration.java.ldap_entry_poisoning
Abstract
動的な LDAP フィルタの構築にユーザー入力を使用すると、攻撃者によるステートメントの改変が可能になります。
Explanation
次の場合に LDAP Injection エラーが発生します。

1. 信頼できないソースからデータがプログラムに入り込んだ場合。

この場合、データのソースが信頼できると Fortify Static Code Analyzer は判断できません。

2. データが LDAP フィルタの動的な構築に使用された場合。
例 1: 次のコードは、指定の上司にレポートする全従業員のレコードを取得する LDAP クエリを動的に構築し、実行します。この上司の名前は HTTP リクエストから読み取られるため、信頼することはできません。


...
DirectorySearcher src =
new DirectorySearcher("(manager=" + managerName.Text + ")");
src.SearchRoot = de;
src.SearchScope = SearchScope.Subtree;

foreach(SearchResult res in src.FindAll()) {
...
}


John Smith という上司にレポートする従業員を検索するような通常の状況では、このコードが実行するフィルタは次のようになります。


(manager=Smith, John)


ただし、フィルタは定数ベースのクエリ文字列とユーザー入力の文字列を連結して動的に構築されるため、managerName に LDAP メタ文字が含まれない場合のみクエリは正しく動作します。攻撃者が managerName に文字列「Hacker, Wiley)(|(objectclass=*)」を入力すると、クエリは次のようになります。


(manager=Hacker, Wiley)(|(objectclass=*))


クエリが実行されるときの許可に応じて、|(objectclass=*) 条件の追加により、ディレクトリにあるすべてのエントリに対してフィルタが一致することになり、攻撃者はユーザーのプール全体に関する情報を取得できるようになります。LDAP クエリが実行されるときの許可によって、攻撃の範囲は限定される場合がありますが、攻撃者がクエリのコマンド構造を制御できる場合、この問題を利用する攻撃により少なくとも LDAP クエリを実行するユーザーがアクセスできるすべてのレコードが影響を受ける場合があります。
desc.semantic.dotnet.ldap_injection
Abstract
動的な LDAP フィルタの構築にユーザー入力を使用すると、攻撃者によるステートメントの改変が可能になります。
Explanation
次の場合に LDAP Injection エラーが発生します。

1. 信頼できないソースからデータがプログラムに入り込んだ場合。

2. データが LDAP フィルタの動的な構築に使用された場合。
例 1: 次のコードは、指定の上司にレポートする全従業員のレコードを取得する LDAP クエリを動的に構築し、実行します。この上司の名前はネットワークソケットから読み取られるため、信頼することはできません。


fgets(manager, sizeof(manager), socket);

snprintf(filter, sizeof(filter, "(manager=%s)", manager);

if ( ( rc = ldap_search_ext_s( ld, FIND_DN, LDAP_SCOPE_BASE,
filter, NULL, 0, NULL, NULL, LDAP_NO_LIMIT,
LDAP_NO_LIMIT, &result ) ) == LDAP_SUCCESS ) {
...
}


John Smith という上司にレポートする従業員を検索するような通常の状況では、このコードが実行するフィルタは次のようになります。


(manager=Smith, John)


ただし、フィルタは定数ベースのクエリ文字列とユーザー入力の文字列を連結して動的に構築されるため、manager に LDAP メタ文字が含まれない場合のみクエリは正しく動作します。攻撃者が manager に文字列「Hacker, Wiley)(|(objectclass=*)」を入力すると、クエリは次のようになります。


(manager=Hacker, Wiley)(|(objectclass=*))


クエリが実行されるときの許可に応じて、|(objectclass=*) 条件の追加により、ディレクトリにあるすべてのエントリに対してフィルタが一致することになり、攻撃者はユーザーのプール全体に関する情報を取得できるようになります。LDAP クエリが実行されるときの許可によって、攻撃の範囲は限定される場合がありますが、攻撃者がクエリのコマンド構造を制御できる場合、この問題を利用する攻撃により少なくとも LDAP クエリを実行するユーザーがアクセスできるすべてのレコードが影響を受ける場合があります。
desc.dataflow.cpp.ldap_injection
Abstract
動的な LDAP フィルタの構築にユーザー入力を使用すると、攻撃者によるステートメントの改変が可能になります。
Explanation
次の場合に LDAP Injection エラーが発生します。
1. 信頼できないソースからデータがプログラムに入り込んだ場合。

2. データが LDAP フィルタの動的な構築に使用された場合。
例 1: 次のコードは、指定の上司にレポートする全従業員のレコードを取得する LDAP クエリを動的に構築し、実行します。この上司の名前は HTTP リクエストから読み取られるため、信頼することはできません。


...
DirContext ctx = new InitialDirContext(env);

String managerName = request.getParameter("managerName");

//retrieve all of the employees who report to a manager

String filter = "(manager=" + managerName + ")";

NamingEnumeration employees = ctx.search("ou=People,dc=example,dc=com",
filter);
...


John Smith という上司にレポートする従業員を検索するような通常の状況では、このコードが実行するフィルタは次のようになります。


(manager=Smith, John)


ただし、フィルタは定数ベースのクエリ文字列とユーザー入力の文字列を連結して動的に構築されるため、managerName に LDAP メタ文字が含まれない場合のみクエリは正しく動作します。攻撃者が managerName に文字列「Hacker, Wiley)(|(objectclass=*)」を入力すると、クエリは次のようになります。


(manager=Hacker, Wiley)(|(objectclass=*))


クエリが実行されるときの許可に応じて、|(objectclass=*) 条件の追加により、ディレクトリにあるすべてのエントリに対してフィルタが一致することになり、攻撃者はユーザーのプール全体に関する情報を取得できるようになります。LDAP クエリが実行されるときの許可によって、攻撃の範囲は限定される場合がありますが、攻撃者がクエリのコマンド構造を制御できる場合、この問題を利用する攻撃により少なくとも LDAP クエリを実行するユーザーがアクセスできるすべてのレコードが影響を受ける場合があります。
desc.dataflow.java.ldap_injection
Abstract
動的な LDAP フィルタの構築にユーザー入力を使用すると、攻撃者によるステートメントの改変が可能になります。
Explanation
次の場合に LDAP Injection エラーが発生します。
1.信頼できないソースからデータがプログラムに入り込んだ場合。

2.データが LDAP フィルタの動的な構築に使用された場合。
例 1: 次のコードは、指定の上司にレポートする全従業員のレコードを取得する LDAP クエリを動的に構築し、実行します。この上司の名前は HTTP リクエストから読み取られるため、信頼することはできません。


...
$managerName = $_POST["managerName"]];

//retrieve all of the employees who report to a manager

$filter = "(manager=" . $managerName . ")";

$result = ldap_search($ds, "ou=People,dc=example,dc=com", $filter);
...


John Smith という上司にレポートする従業員を検索するような通常の状況では、このコードが実行するフィルタは次のようになります。


(manager=Smith, John)


ただし、フィルタは定数ベースのクエリ文字列とユーザー入力の文字列を連結して動的に構築されるため、managerName に LDAP メタ文字が含まれない場合のみクエリは正しく動作します。攻撃者が managerName に文字列「Hacker, Wiley)(|(objectclass=*)」を入力すると、クエリは次のようになります。


(manager=Hacker, Wiley)(|(objectclass=*))


クエリが実行されるときの許可に応じて、|(objectclass=*) 条件の追加により、ディレクトリにあるすべてのエントリに対してフィルタが一致することになり、攻撃者はユーザーのプール全体に関する情報を取得できるようになります。LDAP クエリが実行されるときの許可によって、攻撃の範囲は限定される場合がありますが、攻撃者がクエリのコマンド構造を制御できる場合、この問題を利用する攻撃により少なくとも LDAP クエリを実行するユーザーがアクセスできるすべてのレコードが影響を受ける場合があります。
desc.dataflow.php.ldap_injection