Definition
Recipes12
- Find hardcoded algorithm choices
- Find hardcoded certificates
- Find hardcoded cipher suite choices
- Find hardcoded cryptographic key lengths
- Find hardcoded private keys
- Find hardcoded SSL/TLS protocol choices
- Find hardcoded cryptographic provider names
- Find programmatic security provider editing
- Find SSLContext.setDefault() usage
- Find direct SSL configuration editing
- Find
Security.setProperty(..)calls for certain properties - Report as security issues
Examples
java
- java
- Diff
Before
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLParameters;
import javax.net.ssl.SSLSocket;
import java.security.KeyPairGenerator;
import java.security.Security;
import java.security.Provider;
public class CryptoExample {
private static final String ALGORITHM = "AES";
private static final String PROTOCOL = "TLSv1.2";
private static final int KEY_SIZE = 2048;
public void configureCrypto() throws Exception {
// Hardcoded algorithm
KeyGenerator keyGen = KeyGenerator.getInstance(ALGORITHM);
keyGen.init(128);
// Hardcoded key length
KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
kpg.initialize(KEY_SIZE);
// Hardcoded protocol
SSLContext ctx = SSLContext.getInstance(PROTOCOL);
// Hardcoded provider
Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding", "SunJCE");
// Programmatic provider editing
Provider provider = Security.getProvider("SunJCE");
Security.removeProvider("SunJCE");
Security.insertProviderAt(provider, 1);
// SSL configuration
SSLSocket socket = (SSLSocket) ctx.getSocketFactory().createSocket();
socket.setEnabledProtocols(new String[]{PROTOCOL});
}
}
After
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLParameters;
import javax.net.ssl.SSLSocket;
import java.security.KeyPairGenerator;
import java.security.Security;
import java.security.Provider;
public class CryptoExample {
private static final String ALGORITHM = "AES";
private static final String PROTOCOL = "TLSv1.2";
private static final int KEY_SIZE = 2048;
public void configureCrypto() throws Exception {
// Hardcoded algorithm
KeyGenerator keyGen = /*~~(ALGORITHM use)~~>*/KeyGenerator.getInstance(ALGORITHM);
/*~~(KEY_SIZE use)~~>*/keyGen.init(128);
// Hardcoded key length
KeyPairGenerator kpg = /*~~(ALGORITHM use)~~>*/KeyPairGenerator.getInstance("RSA");
/*~~(KEY_SIZE use)~~>*/kpg.initialize(KEY_SIZE);
// Hardcoded protocol
SSLContext ctx = /*~~(PROTOCOL use)~~>*/SSLContext.getInstance(PROTOCOL);
// Hardcoded provider
Cipher cipher = /*~~(ALGORITHM use)~~>*//*~~(CRYPTO_PROVIDER use)~~>*/Cipher.getInstance("AES/GCM/NoPadding", "SunJCE");
// Programmatic provider editing
Provider provider = Security.getProvider("SunJCE");
/*~~(PROVIDER_NAME use)~~>*/Security.removeProvider("SunJCE");
Security.insertProviderAt(provider, 1);
// SSL configuration
SSLSocket socket = (SSLSocket) ctx.getSocketFactory().createSocket();
/*~~(PROTOCOL use)~~>*/socket.setEnabledProtocols(new String[]{PROTOCOL});
}
}
@@ -18,2 +18,2 @@
public void configureCrypto() throws Exception {
// Hardcoded algorithm
- KeyGenerator keyGen = KeyGenerator.getInstance(ALGORITHM);
- keyGen.init(128);
+ KeyGenerator keyGen = /*~~(ALGORITHM use)~~>*/KeyGenerator.getInstance(ALGORITHM);
+ /*~~(KEY_SIZE use)~~>*/keyGen.init(128);
@@ -22,2 +22,2 @@
// Hardcoded key length
- KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
- kpg.initialize(KEY_SIZE);
+ KeyPairGenerator kpg = /*~~(ALGORITHM use)~~>*/KeyPairGenerator.getInstance("RSA");
+ /*~~(KEY_SIZE use)~~>*/kpg.initialize(KEY_SIZE);
@@ -26,1 +26,1 @@
// Hardcoded protocol
- SSLContext ctx = SSLContext.getInstance(PROTOCOL);
+ SSLContext ctx = /*~~(PROTOCOL use)~~>*/SSLContext.getInstance(PROTOCOL);
@@ -29,1 +29,1 @@
// Hardcoded provider
- Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding", "SunJCE");
+ Cipher cipher = /*~~(ALGORITHM use)~~>*//*~~(CRYPTO_PROVIDER use)~~>*/Cipher.getInstance("AES/GCM/NoPadding", "SunJCE");
@@ -33,1 +33,1 @@
// Programmatic provider editing
Provider provider = Security.getProvider("SunJCE");
- Security.removeProvider("SunJCE");
+ /*~~(PROVIDER_NAME use)~~>*/Security.removeProvider("SunJCE");
Security.insertProviderAt(provider, 1);
@@ -38,1 +38,1 @@
// SSL configuration
SSLSocket socket = (SSLSocket) ctx.getSocketFactory().createSocket();
- socket.setEnabledProtocols(new String[]{PROTOCOL});
+ /*~~(PROTOCOL use)~~>*/socket.setEnabledProtocols(new String[]{PROTOCOL});
}
java
- java
- Diff
Before
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLParameters;
import javax.net.ssl.SSLSocket;
import java.security.KeyPairGenerator;
import java.security.Security;
import java.security.Provider;
public class CryptoExample {
private static final String ALGORITHM = "AES";
private static final String PROTOCOL = "TLSv1.2";
private static final int KEY_SIZE = 2048;
public void configureCrypto() throws Exception {
// Hardcoded algorithm
KeyGenerator keyGen = KeyGenerator.getInstance(ALGORITHM);
keyGen.init(128);
// Hardcoded key length
KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
kpg.initialize(KEY_SIZE);
// Hardcoded protocol
SSLContext ctx = SSLContext.getInstance(PROTOCOL);
// Hardcoded provider
Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding", "SunJCE");
// Programmatic provider editing
Provider provider = Security.getProvider("SunJCE");
Security.removeProvider("SunJCE");
Security.insertProviderAt(provider, 1);
// SSL configuration
SSLSocket socket = (SSLSocket) ctx.getSocketFactory().createSocket();
socket.setEnabledProtocols(new String[]{PROTOCOL});
}
}
After
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLParameters;
import javax.net.ssl.SSLSocket;
import java.security.KeyPairGenerator;
import java.security.Security;
import java.security.Provider;
public class CryptoExample {
private static final String ALGORITHM = "AES";
private static final String PROTOCOL = "TLSv1.2";
private static final int KEY_SIZE = 2048;
public void configureCrypto() throws Exception {
// Hardcoded algorithm
KeyGenerator keyGen = /*~~(ALGORITHM use)~~>*/KeyGenerator.getInstance(ALGORITHM);
/*~~(KEY_SIZE use)~~>*/keyGen.init(128);
// Hardcoded key length
KeyPairGenerator kpg = /*~~(ALGORITHM use)~~>*/KeyPairGenerator.getInstance("RSA");
/*~~(KEY_SIZE use)~~>*/kpg.initialize(KEY_SIZE);
// Hardcoded protocol
SSLContext ctx = /*~~(PROTOCOL use)~~>*/SSLContext.getInstance(PROTOCOL);
// Hardcoded provider
Cipher cipher = /*~~(ALGORITHM use)~~>*//*~~(CRYPTO_PROVIDER use)~~>*/Cipher.getInstance("AES/GCM/NoPadding", "SunJCE");
// Programmatic provider editing
Provider provider = Security.getProvider("SunJCE");
/*~~(PROVIDER_NAME use)~~>*/Security.removeProvider("SunJCE");
Security.insertProviderAt(provider, 1);
// SSL configuration
SSLSocket socket = (SSLSocket) ctx.getSocketFactory().createSocket();
/*~~(PROTOCOL use)~~>*/socket.setEnabledProtocols(new String[]{PROTOCOL});
}
}
@@ -18,2 +18,2 @@
public void configureCrypto() throws Exception {
// Hardcoded algorithm
- KeyGenerator keyGen = KeyGenerator.getInstance(ALGORITHM);
- keyGen.init(128);
+ KeyGenerator keyGen = /*~~(ALGORITHM use)~~>*/KeyGenerator.getInstance(ALGORITHM);
+ /*~~(KEY_SIZE use)~~>*/keyGen.init(128);
@@ -22,2 +22,2 @@
// Hardcoded key length
- KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
- kpg.initialize(KEY_SIZE);
+ KeyPairGenerator kpg = /*~~(ALGORITHM use)~~>*/KeyPairGenerator.getInstance("RSA");
+ /*~~(KEY_SIZE use)~~>*/kpg.initialize(KEY_SIZE);
@@ -26,1 +26,1 @@
// Hardcoded protocol
- SSLContext ctx = SSLContext.getInstance(PROTOCOL);
+ SSLContext ctx = /*~~(PROTOCOL use)~~>*/SSLContext.getInstance(PROTOCOL);
@@ -29,1 +29,1 @@
// Hardcoded provider
- Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding", "SunJCE");
+ Cipher cipher = /*~~(ALGORITHM use)~~>*//*~~(CRYPTO_PROVIDER use)~~>*/Cipher.getInstance("AES/GCM/NoPadding", "SunJCE");
@@ -33,1 +33,1 @@
// Programmatic provider editing
Provider provider = Security.getProvider("SunJCE");
- Security.removeProvider("SunJCE");
+ /*~~(PROVIDER_NAME use)~~>*/Security.removeProvider("SunJCE");
Security.insertProviderAt(provider, 1);
@@ -38,1 +38,1 @@
// SSL configuration
SSLSocket socket = (SSLSocket) ctx.getSocketFactory().createSocket();
- socket.setEnabledProtocols(new String[]{PROTOCOL});
+ /*~~(PROTOCOL use)~~>*/socket.setEnabledProtocols(new String[]{PROTOCOL});
}
Usage
Run this recipe
This recipe has no required configuration options. Users of Moderne can run it via the Moderne CLI.
You will need to have configured the Moderne CLI on your machine before you can run the following command.
shell
mod run . --recipe PostQuantumCryptography
If the recipe is not available locally, then you can install it using:
mod config recipes jar install io.moderne.recipe:rewrite-cryptography:0.14.3
Data tables
Taint flow
org.openrewrite.analysis.java.taint.table.TaintFlowTableRecords taint flows from sources to sinks with their taint types.
| Column | Description |
|---|---|
| Source file | The source file that the method call occurred in. |
| Source line | The line number where the taint source is located. |
| Source | The source code where taint originates. |
| Sink line | The line number where the taint sink is located. |
| Sink | The sink code where taint flows to. |
| Taint type | The taint type that matched at the sink. |
Insecure `Security.setProperty(..)` uses.
io.moderne.cryptography.table.InsecureSetPropertiesAn itemization of the properties used in such calls
| Column | Description |
|---|---|
| Source file | Path to the file where the result was found |
| Source code | The source code where the insecure property is defined, which may not contain a Security.setProperty(..) call directly if the property was defined somewhere and through data flow analysis we've concluded that it is later used in a Security.setProperty(..) call. |
| Property | The property that is set insecurely, e.g. crypto.policy. |
Security issues
io.moderne.devcenter.table.SecurityIssuesSecurity issues in the repository.
| Column | Description |
|---|---|
| Ordinal | The ordinal position of this issue relative to other issues. |
| Issue name | The name of the security issue. |
Source files that had results
org.openrewrite.table.SourcesFileResultsSource files that were modified by the recipe run.
| Column | Description |
|---|---|
| Source path before the run | The source path of the file before the run. null when a source file was created during the run. |
| Source path after the run | A recipe may modify the source path. This is the path after the run. null when a source file was deleted during the run. |
| Parent of the recipe that made changes | In a hierarchical recipe, the parent of the recipe that made a change. Empty if this is the root of a hierarchy or if the recipe is not hierarchical at all. |
| Recipe that made changes | The specific recipe that made a change. |
| Estimated time saving | An estimated effort that a developer to fix manually instead of using this recipe, in unit of seconds. |
| Cycle | The recipe cycle in which the change was made. |
Source files that had search results
org.openrewrite.table.SearchResultsSearch results that were found during the recipe run.
| Column | Description |
|---|---|
| Source path of search result before the run | The source path of the file with the search result markers present. |
| Source path of search result after run the run | A recipe may modify the source path. This is the path after the run. null when a source file was deleted during the run. |
| Result | The trimmed printed tree of the LST element that the marker is attached to. |
| Description | The content of the description of the marker. |
| Recipe that added the search marker | The specific recipe that added the Search marker. |
Source files that errored on a recipe
org.openrewrite.table.SourcesFileErrorsThe details of all errors produced by a recipe run.
| Column | Description |
|---|---|
| Source path | The file that failed to parse. |
| Recipe that made changes | The specific recipe that made a change. |
| Stack trace | The stack trace of the failure. |
Recipe performance
org.openrewrite.table.RecipeRunStatsStatistics used in analyzing the performance of recipes.
| Column | Description |
|---|---|
| The recipe | The recipe whose stats are being measured both individually and cumulatively. |
| Source file count | The number of source files the recipe ran over. |
| Source file changed count | The number of source files which were changed in the recipe run. Includes files created, deleted, and edited. |
| Cumulative scanning time (ns) | The total time spent across the scanning phase of this recipe. |
| Max scanning time (ns) | The max time scanning any one source file. |
| Cumulative edit time (ns) | The total time spent across the editing phase of this recipe. |
| Max edit time (ns) | The max time editing any one source file. |