Skip to content

Commit dfd2553

Browse files
committed
Weak RSA key size query, docs, test
1 parent cabf6d0 commit dfd2553

9 files changed

Lines changed: 111 additions & 80 deletions

File tree

powershell/ql/lib/semmle/code/powershell/security/cryptography/CryptoArtifact.qll

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,3 +36,9 @@ abstract class BlockMode extends CryptographicAlgorithm {
3636
else result = unknownAlgorithm()
3737
}
3838
}
39+
40+
abstract class AsymmetricKeyCreation extends CryptographicArtifact {
41+
abstract string getAlgorithmName();
42+
43+
abstract int getKeySize();
44+
}

powershell/ql/lib/semmle/code/powershell/security/cryptography/CryptographyModule.qll

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,3 +194,45 @@ class CipherBlockModeEnum extends BlockMode {
194194

195195
override string getName() { result = modeName }
196196
}
197+
198+
class RsaCreateKeyCreation extends AsymmetricKeyCreation, DataFlow::CallNode {
199+
int keySize;
200+
201+
RsaCreateKeyCreation() {
202+
exists(string method |
203+
method = ["create", "new"] and
204+
this =
205+
API::getTopLevelMember("system")
206+
.getMember("security")
207+
.getMember("cryptography")
208+
.getMember(["rsa", "rsacryptoserviceprovider"])
209+
.getMember(method)
210+
.asCall()
211+
) and
212+
keySize = this.getAnArgument().asExpr().getExpr().(ConstExpr).getValueString().toInt()
213+
}
214+
215+
override string getAlgorithmName() { result = "rsa" }
216+
217+
override int getKeySize() { result = keySize }
218+
}
219+
220+
class RsaCspObjectKeyCreation extends AsymmetricKeyCreation, CryptoAlgorithmObjectCreation {
221+
int keySize;
222+
223+
RsaCspObjectKeyCreation() {
224+
objectName =
225+
[
226+
"system.security.cryptography.rsacryptoserviceprovider",
227+
"rsacryptoserviceprovider"
228+
] and
229+
exists(DataFlow::Node arg |
230+
arg = this.getAnArgument() and
231+
keySize = arg.asExpr().getExpr().(ConstExpr).getValueString().toInt()
232+
)
233+
}
234+
235+
override string getAlgorithmName() { result = "rsa" }
236+
237+
override int getKeySize() { result = keySize }
238+
}

powershell/ql/src/queries/security/cwe-326/WeakAsymmetricKey.ql

Lines changed: 0 additions & 79 deletions
This file was deleted.
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
<!DOCTYPE qhelp PUBLIC "-//Semmle//qhelp//EN" "qhelp.dtd">
2+
<qhelp>
3+
<overview>
4+
<p>
5+
Modern encryption relies on it being computationally infeasible to break the cipher and
6+
decode a message without the key. As computational power increases, the ability to break
7+
ciphers grows and keys need to become larger.
8+
</p>
9+
<p>
10+
RSA keys smaller than 2048 bits are considered weak and can potentially be broken using
11+
modern hardware. Using such keys compromises the confidentiality and integrity of
12+
encrypted data.
13+
</p>
14+
</overview>
15+
16+
<recommendation>
17+
<p>
18+
Use an RSA key size of at least 2048 bits. For long-term security, consider using
19+
4096-bit keys.
20+
</p>
21+
<p>
22+
When calling <code>[System.Security.Cryptography.RSA]::Create()</code> or creating an
23+
<code>RSACryptoServiceProvider</code>, always specify a key size of 2048 or greater.
24+
</p>
25+
</recommendation>
26+
27+
<example>
28+
<p>
29+
The following example shows the creation of an RSA key with only 1024 bits, which is
30+
considered weak:
31+
</p>
32+
<sample src="test.ps1" />
33+
</example>
34+
35+
<references>
36+
<li>NIST, SP 800-131A: <a href="https://csrc.nist.gov/publications/detail/sp/800-131a/rev-2/final">Transitioning the Use of Cryptographic Algorithms and Key Lengths</a>.</li>
37+
<li>Wikipedia: <a href="https://en.wikipedia.org/wiki/RSA_(cryptosystem)">RSA cryptosystem</a>.</li>
38+
<li>CWE-327: <a href="https://cwe.mitre.org/data/definitions/327.html">Use of a Broken or Risky Cryptographic Algorithm</a>.</li>
39+
</references>
40+
</qhelp>
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
/**
2+
* @name Weak asymmetric key size
3+
* @description Using RSA keys smaller than 2048 bits does not provide adequate security.
4+
* @kind problem
5+
* @problem.severity error
6+
* @security-severity 7.5
7+
* @precision high
8+
* @id powershell/weak-asymmetric-key-size
9+
* @tags security
10+
* external/cwe/cwe-327
11+
*/
12+
13+
import powershell
14+
import semmle.code.powershell.dataflow.DataFlow
15+
import semmle.code.powershell.security.cryptography.Concepts
16+
17+
from AsymmetricKeyCreation keyCreation, int keySize
18+
where
19+
keySize = keyCreation.getKeySize() and
20+
keySize < 2048
21+
select keyCreation,
22+
"RSA key size " + keySize.toString() + " bits is below the minimum of 2048 bits."

powershell/ql/test/query-tests/security/cwe-326/WeakAsymmetricKey/WeakAsymmetricKey.qlref

Lines changed: 0 additions & 1 deletion
This file was deleted.

powershell/ql/test/query-tests/security/cwe-326/WeakAsymmetricKey/WeakAsymmetricKey.expected renamed to powershell/ql/test/query-tests/security/cwe-327/WeakAsymmetricKeySize/WeakAsymmetricKeySize.expected

File renamed without changes.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
queries/security/cwe-327/WeakAsymmetricKeySize.ql

powershell/ql/test/query-tests/security/cwe-326/WeakAsymmetricKey/test.ps1 renamed to powershell/ql/test/query-tests/security/cwe-327/WeakAsymmetricKeySize/test.ps1

File renamed without changes.

0 commit comments

Comments
 (0)