Skip to content

Add Security Rule for Detecting Small Cryptographic Key Sizes #131

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 11 commits into from
Jan 20, 2025
42 changes: 42 additions & 0 deletions rules/c/security/small-key-size-c.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
id: small-key-size-c
language: c
severity: warning
message: >-
$KEY_FUNCTION` is using a key size of only $KEY_BITS bits. This is
less than the recommended key size of 2048 bits.
note: >-
[CWE-326]: Inadequate Encryption Strength
[OWASP A02:2021]: Cryptographic Failures
[OWASP A03:2017]: Sensitive Data Exposure
[REFERENCES]
https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-131Ar2.pdf
https://owasp.org/Top10/A02_2021-Cryptographic_Failures
ast-grep-essentials: true

rule:
kind: call_expression
all:
- has:
stopBy: end
kind: identifier
regex: ^(DH_generate_parameters_ex|DSA_generate_parameters_ex|EVP_PKEY_CTX_set_dh_paramgen_prime_len|EVP_PKEY_CTX_set_dsa_paramgen_bits|EVP_PKEY_CTX_set_rsa_keygen_bits|RSA_generate_key_ex|RSA_generate_key_fips)$
- not:
has:
stopBy: end
kind: field_identifier
regex: ^(DH_generate_parameters_ex|DSA_generate_parameters_ex|EVP_PKEY_CTX_set_dh_paramgen_prime_len|EVP_PKEY_CTX_set_dsa_paramgen_bits|EVP_PKEY_CTX_set_rsa_keygen_bits|RSA_generate_key_ex|RSA_generate_key_fips)$
- has:
stopBy: neighbor
kind: argument_list
has:
stopBy: neighbor
any:
- kind: number_literal
- kind: binary_expression
- kind: unary_expression
nthChild: 2
regex: ^([+-]*\(*[+-]*((0|[1-9][0-9]{0,2}|1[0-9]{3}|20[0-3][0-9]|204[0-7])(\.[0-9]+)?|((0|[1-9][0-9]{0,2}|1[0-9]{3}|20[0-3][0-9]|204[0-7])(\.[0-9]+)?\/[1-9][0-9]*)|(\.[0-9]+)|(\.[0-9]+\/[1-9][0-9]*))\)*)$
- not:
has:
stopBy: end
kind: ERROR
42 changes: 42 additions & 0 deletions rules/cpp/small-key-size-cpp.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
id: small-key-size-cpp
language: cpp
severity: warning
message: >-
$KEY_FUNCTION` is using a key size of only $KEY_BITS bits. This is
less than the recommended key size of 2048 bits.
note: >-
[CWE-326]: Inadequate Encryption Strength
[OWASP A02:2021]: Cryptographic Failures
[OWASP A03:2017]: Sensitive Data Exposure
[REFERENCES]
https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-131Ar2.pdf
https://owasp.org/Top10/A02_2021-Cryptographic_Failures
ast-grep-essentials: true

rule:
kind: call_expression
all:
- has:
stopBy: end
kind: identifier
regex: ^(DH_generate_parameters_ex|DSA_generate_parameters_ex|EVP_PKEY_CTX_set_dh_paramgen_prime_len|EVP_PKEY_CTX_set_dsa_paramgen_bits|EVP_PKEY_CTX_set_rsa_keygen_bits|RSA_generate_key_ex|RSA_generate_key_fips)$
- not:
has:
stopBy: end
kind: field_identifier
regex: ^(DH_generate_parameters_ex|DSA_generate_parameters_ex|EVP_PKEY_CTX_set_dh_paramgen_prime_len|EVP_PKEY_CTX_set_dsa_paramgen_bits|EVP_PKEY_CTX_set_rsa_keygen_bits|RSA_generate_key_ex|RSA_generate_key_fips)$
- has:
stopBy: neighbor
kind: argument_list
has:
stopBy: neighbor
any:
- kind: number_literal
- kind: binary_expression
- kind: unary_expression
nthChild: 2
regex: ^([+-]*\(*[+-]*((0|[1-9][0-9]{0,2}|1[0-9]{3}|20[0-3][0-9]|204[0-7])(\.[0-9]+)?|((0|[1-9][0-9]{0,2}|1[0-9]{3}|20[0-3][0-9]|204[0-7])(\.[0-9]+)?\/[1-9][0-9]*)|(\.[0-9]+)|(\.[0-9]+\/[1-9][0-9]*))\)*)$
- not:
has:
stopBy: end
kind: ERROR
9 changes: 9 additions & 0 deletions tests/__snapshots__/return-c-str-cpp-snapshot.yml
Original file line number Diff line number Diff line change
Expand Up @@ -27,3 +27,12 @@ snapshots:
style: primary
start: 28
end: 57
? |
char *return_namespace_directly() {
return std::string("foo").c_str();
}
: labels:
- source: return std::string("foo").c_str();
style: primary
start: 38
end: 72
23 changes: 23 additions & 0 deletions tests/__snapshots__/small-key-size-c-snapshot.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
id: small-key-size-c
snapshots:
? |
void foo() {
DH_generate_parameters_ex(NULL, 1024);
}
: labels:
- source: DH_generate_parameters_ex(NULL, 1024)
style: primary
start: 15
end: 52
- source: DH_generate_parameters_ex
style: secondary
start: 15
end: 40
- source: '1024'
style: secondary
start: 47
end: 51
- source: (NULL, 1024)
style: secondary
start: 40
end: 52
23 changes: 23 additions & 0 deletions tests/__snapshots__/small-key-size-cpp-snapshot.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
id: small-key-size-cpp
snapshots:
? |
void foo() {
DH_generate_parameters_ex(NULL, 1024);
}
: labels:
- source: DH_generate_parameters_ex(NULL, 1024)
style: primary
start: 15
end: 52
- source: DH_generate_parameters_ex
style: secondary
start: 15
end: 40
- source: '1024'
style: secondary
start: 47
end: 51
- source: (NULL, 1024)
style: secondary
start: 40
end: 52
14 changes: 14 additions & 0 deletions tests/c/small-key-size-c-test.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
id: small-key-size-c
valid:
- |
void foo() {
DH_generate_parameters_ex(NULL, 2049);
}

invalid:
- |
void foo() {
DH_generate_parameters_ex(NULL, 1024);
}


14 changes: 14 additions & 0 deletions tests/cpp/small-key-size-cpp-test.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
id: small-key-size-cpp
valid:
- |
void foo() {
DH_generate_parameters_ex(NULL, 2049);
}

invalid:
- |
void foo() {
DH_generate_parameters_ex(NULL, 1024);
}