-
Notifications
You must be signed in to change notification settings - Fork 31
Description
Hi,
My team is conducting academic research on Java Cryptography API based misuse using your tool. We found that we could not detect some potential cryptographic misuses.
We believe this may be due to underlying implementation or design gaps. Each cryptographic vulnerability was generated as a barebone Java project that only contained a single vulnerability in the main function and used up to two java source files. A jar was made which was then scanned using CryptoGuard.
Additionally, all cryptographic API calls were from Java Cryptographic Architecture (JCA).
Environment
| Component | Version |
|---|---|
| Java Runtime | OpenJDK version 1.8.0_232 64 bit |
| CG Commit Used | 42197b0 |
Even though the commit is different from the current version, I don't think much has changed in between these commits.
Problem
Weak algorithm names are not detected when they go through various types of transformations. We noticed this for both MessageDigest and Cipher.
Code
Replacing a Secure Parameter with an Insecure Parameter:
MessageDigest.getInstance("SHA-256".replace("SHA-256", "MD5"));Replacing an Insecure Parameter with an Insecure Parameter:
Cipher.getInstance("AES".replace("A", "D"));where "AES" by itself is insecure as it defaults to using ECB.
Transforming string case, e.g., from lower to upper case:
Cipher.getInstance("des".toUpperCase(Locale.English));Replacing a noisy version of insecure parameters:
Cipher.getInstance("DE$S".replace("$", ""));Inserting an Insecure Parameter via method chaining calls:
public class CipherExample {
private String cipherName = "AES/GCM/NoPadding";
public CipherExample methodA() {
cipherName = "AES/GCM/NoPadding";
return this;
}
public CipherExample methodB() {
cipherName = "DES";
return this;
}
public String getCipherName(){
return cipherName;
}
public static void main(String[] args) throws NoSuchAlgorithmException, NoSuchPaddingException {
Cipher c = Cipher.getInstance(new CipherExample().methodA().methodB().getCipherName());
System.out.println(c.getAlgorithm());
}
}
Please let me know if you need any additional information (e.g., logs from our side) in fixing these issues.
Thanks! :)