Skip to content
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

Add 201 parametric crypto (JCA) misuses #427

Open
wants to merge 96 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 63 commits
Commits
Show all changes
96 commits
Select commit Hold shift + click to select a range
a4f3df1
added new datasets
Jun 5, 2018
dcdbbbc
changed characteristics to violations
Jun 8, 2018
e29497d
update dataset cloudstack
Jun 11, 2018
db611d4
updated dataset wicket
Jun 11, 2018
a9e6798
build commands
Jun 14, 2018
d6ef915
Findbugs
Jul 3, 2018
256ee61
added Findbugs
Jul 3, 2018
6748599
adding Findbugs
Jul 3, 2018
688af87
adding Findbugs
Jul 3, 2018
8af0733
config files
Jul 11, 2018
917c26d
- added new data sets
anam-dodhy Aug 9, 2018
6fabda1
- deleted data sets: kafka-eagle (compilation error), dragonite-java …
anam-dodhy Aug 11, 2018
119bc97
- added new datasets
anam-dodhy Aug 25, 2018
4a0f75a
- new data sets created
anam-dodhy Aug 28, 2018
228fa65
- added 2 new data sets out of which dragonite-java is currently thro…
anam-dodhy Aug 28, 2018
3c4a759
- violation types updated
anam-dodhy Sep 6, 2018
44290eb
- added correct-usages for selected projects
anam-dodhy Sep 11, 2018
2a65cf5
- corrected paths in version.yml and in individual misuses
anam-dodhy Sep 22, 2018
b6aac7e
- updated violation types in jeesuite-libs dataset
anam-dodhy Sep 23, 2018
04df24c
- added a new data sets for dbeaver-core
anam-dodhy Oct 4, 2018
518f55a
- updated Game-server data set with a missing misuse
anam-dodhy Oct 30, 2018
d8812b5
- removed non gradle projects from the "gradle data" folder
anam-dodhy Oct 30, 2018
45d1e54
- adding google data search metadata file
anam-dodhy Nov 2, 2018
c2dd56d
Update metadata.html
anam-dodhy Nov 2, 2018
02734bf
Update metadata.html
anam-dodhy Nov 2, 2018
a2bb205
Update metadata.html
anam-dodhy Nov 2, 2018
fe5821a
Update metadata.html
anam-dodhy Nov 2, 2018
544eacf
Update metadata.html
anam-dodhy Nov 2, 2018
61c8644
- updated google data set metadata
anam-dodhy Nov 2, 2018
42d0a71
Merge branch 'master' of https://github.com/anam-dodhy/MUBench
anam-dodhy Nov 2, 2018
c9495aa
- updated meta data file for google datasets search
anam-dodhy Nov 2, 2018
a96fc02
- added google verification
anam-dodhy Nov 2, 2018
a87444a
Update README.md
anam-dodhy Nov 2, 2018
3297ff0
- added google verification file
anam-dodhy Nov 2, 2018
a652989
Merge branch 'master' of https://github.com/anam-dodhy/MUBench
anam-dodhy Nov 2, 2018
f548a11
- removed google verification file from root folder
anam-dodhy Nov 2, 2018
acb7f37
- edited README file
anam-dodhy Nov 2, 2018
9489847
- edited README
anam-dodhy Nov 2, 2018
d26b4a4
- dragonite-java gradle data set added
anam-dodhy Nov 13, 2018
9d98173
- reverted changed to README file
anam-dodhy Nov 15, 2018
01c9ac7
- added all data sets for all gradle projects in "gradle data" directory
anam-dodhy Nov 17, 2018
c22e33e
- correct-usage updated for smart dataset
anam-dodhy Nov 26, 2018
e306cf4
- updated violation type for ha-bridge project
anam-dodhy Dec 5, 2018
12329bf
- configuration file with Bug Patterns to identify parametric cryptog…
anam-dodhy Dec 29, 2018
f826b16
Merge branch 'master' of https://github.com/anam-dodhy/MUBench into t…
akwick Jan 3, 2019
d26e6df
Remove data which is no collected during thesis
akwick Jan 3, 2019
1246bdb
Move gradle projects to main project structure
akwick Jan 4, 2019
dd04d0c
Add statistics file for all 200 misuses
akwick Jan 4, 2019
e81436b
Remove dublicated dragonite-java project
akwick Jan 4, 2019
6a65aa6
Add schema.org dataset metadata
akwick Jan 10, 2019
2ddd34d
Add schema.org dataset metadata
akwick Jan 10, 2019
3165d8b
Merge branch 'thesis-2018-dodhy' of https://github.com/akwick/MUBench…
akwick Jan 10, 2019
215b6f6
Add violation category
akwick Jan 14, 2019
a4be32b
Update datasets
akwick Feb 7, 2019
97b87b8
Merge remote-tracking branch 'stg/master' into thesis-2018-dodhy
akwick Feb 7, 2019
9096121
Merge branch 'master' of https://github.com/stg-tud/MUBench
akwick Mar 7, 2019
35d1edb
Delete data-sets-exp1 folder
akwick Mar 7, 2019
bf82114
Merge branch 'master' into thesis-2018-anam-dodhy
akwick Mar 7, 2019
ca3e808
Add misuses to version.yml
akwick Mar 7, 2019
a8e2450
Update Readme
akwick Mar 7, 2019
b7e53c6
Remove vidyas misuses
akwick Mar 7, 2019
806c3f5
Remove vidyas misuses
akwick Mar 7, 2019
90e0204
Merge branch 'thesis-2018-anam-dodhy' of https://github.com/akwick/MU…
akwick Mar 7, 2019
285d7db
Remove .DS_Store files for PR
akwick Mar 15, 2019
6441861
Remove execute permission for core-all-api-misuses.xml
akwick Mar 15, 2019
ecc62a8
Remove Findbugs.jar
akwick Mar 15, 2019
df4d685
Remove Vidya's config for FindBugs
akwick Mar 15, 2019
94b7b36
Checkout latest versions of stg-tud/MUBench
akwick Mar 15, 2019
e82b7ee
Replace /target/classes with $mvn.default.classes
akwick Mar 15, 2019
c596f9d
Add URL to Issue in Dataset
akwick Apr 16, 2019
1b6b13d
Add source to misuse.yml
akwick May 8, 2019
8c0aac6
Add URL too
akwick May 8, 2019
eed60ed
Add placeholder for gradle build path
akwick May 8, 2019
24dadc0
Remove Vidya's dataset
akwick May 8, 2019
b9ba545
Change heading datasets.yml
akwick May 8, 2019
7ac8a96
Add all datasets from stg master
akwick May 8, 2019
5cc1ee5
Add description to findbugs dataset
akwick May 8, 2019
8cbfda3
Minimize correct examples for misuses
akwick May 15, 2019
1effe62
Minor changes in misuse.yml-files
akwick May 15, 2019
1a58711
Fix cmd commands for public-cms
akwick May 15, 2019
c042a9d
Reset to commit 76edd65d831070b28d5f4b75e09dcf03961ee771
akwick May 15, 2019
5055704
Reset to 8d9e1faa565b7fc59ea6f1c6ae82e8a251d32fdc for worpressa
akwick May 15, 2019
347ce9c
Specify internal flag to false in misuse files
akwick May 16, 2019
43f5c93
Add information not all projects compilable
akwick May 16, 2019
5789ef1
Remove openzaly
akwick May 16, 2019
db6c7b2
Remove openzaly
akwick May 16, 2019
7f30252
Merge branch 'thesis-2018-anam-dodhy' of https://github.com/akwick/MU…
akwick May 16, 2019
2a5971f
Fix build cmds
akwick May 16, 2019
d1c2d6e
Fix ha-bridge minimized examples
akwick May 26, 2019
30704f7
Fix dragonite-java
akwick May 26, 2019
c52cc8c
Fix instagram4j
akwick May 26, 2019
0803d09
Fix jeesuite-libs
akwick May 26, 2019
2111154
Fix nettygameserver
akwick May 26, 2019
85316d4
Fix smart
akwick May 26, 2019
3f565d2
Fix correct usages
akwick May 26, 2019
8fcb6ea
Merge branch 'stg-tud:master' into thesis-2018-anam-dodhy
akwick Dec 8, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
<img align="right" width="320" height="320" alt="MUBench Logo" src="./meta/logo.png?raw=true" />
<img align="right" width="320" height="320" alt="MUBench Logo" src="./meta/logo.png?raw=true" />
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Unrelated changes, please revert.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Solved in commit 94b7b36.


# MUBench

Expand Down
2 changes: 1 addition & 1 deletion data/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -249,4 +249,4 @@ Please create a [new issue](https://github.com/stg-tud/MUBench/issues/new) with
* A short description of the misuse and its fix.
* Instructions how to checkout and compile the project with the misuse from version control.
* The exact location of the misuse in the project's source code (file, class, and method).
* (Optional) A link to an issue report that uncovered the misuse.
* (Optional) A link to an issue report that uncovered the misuse.
akwick marked this conversation as resolved.
Show resolved Hide resolved
15 changes: 15 additions & 0 deletions data/abixen-platform/misuses/1/misuse.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
api:
- javax.crypto.spec.IvParameterSpec
violations:
- insecure/condition/randomization
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

MUBench currently only supports violations types from the MUC. We can talk about introducing (sub)categories for the crypto case, but simply adding random categories will break at least the statistics computation.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Which statistics computation do you have in mind? The one provided by the docker container or the review site? The later one shows statistics for the new violation types.

description: >
First parameter while initializing the IvParameterSpec object was not properly randomized.
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"not properly randomized" is a fairly vague description of the problem. Can you provide more details, e.g., by explaining how it should be done/could be fixed?

Please us backticks to properly format type names.

location:
file: com/abixen/platform/service/businessintelligence/multivisualisation/domain/model/util/AES128Encoder.java
method: "decryptPassword(String)"
line: 66
internal:
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please specify internal: false for these misuses, as the JCE APIs are not part of any of the projects you added.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for pointing this out. I have resolved this in commit 347ce9c.

pattern:
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This key is obsolete and can be removed.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just to clarify: You mean the key pattern?

crash: false
source:
name:
akwick marked this conversation as resolved.
Show resolved Hide resolved
15 changes: 15 additions & 0 deletions data/abixen-platform/misuses/2/misuse.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
api:
- javax.crypto.Cipher
violations:
- insecure/condition/key
description: >
Second parameter while initializing the Cipher object was not properly generatedKey.
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"not properly generatedKey" is not a proper sentence, please fix.

location:
file: com/abixen/platform/service/businessintelligence/multivisualisation/domain/model/util/AES128Encoder.java
method: "decryptPassword(String)"
line: 66
internal:
pattern:
crash: false
source:
name:
15 changes: 15 additions & 0 deletions data/abixen-platform/misuses/3/misuse.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
api:
- javax.crypto.Cipher
violations:
- insecure/condition/transformation
description: >
First parameter in Cipher.getInstance(String) is with value "AES/CBC/PKCS5PADDING" which should be any of AES/CBC/{Empty String, PKCS7Padding, PKCS5Padding, ISO10126Padding}.
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is the problem here the incorrect casing of the padding? If so, please state explicitly.

location:
file: com/abixen/platform/service/businessintelligence/multivisualisation/domain/model/util/AES128Encoder.java
method: "decryptPassword(String)"
line: 65
internal:
pattern:
crash: false
source:
name:
15 changes: 15 additions & 0 deletions data/abixen-platform/misuses/4/misuse.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
api:
- javax.crypto.Cipher
violations:
- insecure/condition/IV
description: >
Third parameter while initializing the Cipher object was not properly preparedIV.
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"not properly preparedIV" is not a proper sentence, please fix.

location:
file: com/abixen/platform/service/businessintelligence/multivisualisation/domain/model/util/AES128Encoder.java
method: "decryptPassword(String)"
line: 66
internal:
pattern:
crash: false
source:
name:
15 changes: 15 additions & 0 deletions data/abixen-platform/misuses/5/misuse.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
api:
- javax.crypto.Cipher
violations:
- insecure/condition/transformation
description: >
First parameter in Cipher.getInstance(String) is with value "AES/CBC/PKCS5PADDING" which should be any of AES/CBC/{Empty String, PKCS7Padding, PKCS5Padding, ISO10126Padding}.
location:
file: com/abixen/platform/service/businessintelligence/multivisualisation/domain/model/util/AES128Encoder.java
method: "encryptPassword(String)"
line: 54
internal:
pattern:
crash: false
source:
name:
15 changes: 15 additions & 0 deletions data/abixen-platform/misuses/6/misuse.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
api:
- javax.crypto.spec.IvParameterSpec
violations:
- insecure/condition/randomization
description: >
First parameter while initializing the IvParameterSpec object was not properly randomized.
location:
file: com/abixen/platform/service/businessintelligence/multivisualisation/domain/model/util/AES128Encoder.java
method: "encryptPassword(String)"
line: 55
internal:
pattern:
crash: false
source:
name:
15 changes: 15 additions & 0 deletions data/abixen-platform/misuses/7/misuse.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
api:
- javax.crypto.Cipher
violations:
- insecure/condition/key
description: >
Second parameter while initializing the Cipher object was not properly generatedKey.
location:
file: com/abixen/platform/service/businessintelligence/multivisualisation/domain/model/util/AES128Encoder.java
method: "encryptPassword(String)"
line: 55
internal:
pattern:
crash: false
source:
name:
15 changes: 15 additions & 0 deletions data/abixen-platform/misuses/8/misuse.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
api:
- javax.crypto.Cipher
violations:
- insecure/condition/IV
description: >
Third parameter while initializing the Cipher object was not properly preparedIV.
location:
file: com/abixen/platform/service/businessintelligence/multivisualisation/domain/model/util/AES128Encoder.java
method: "encryptPassword(String)"
line: 55
internal:
pattern:
crash: false
source:
name:
15 changes: 15 additions & 0 deletions data/abixen-platform/misuses/9/misuse.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
api:
- javax.crypto.spec.SecretKeySpec
violations:
- insecure/condition/randomization
description: >
First parameter while initializing the SecretKeySpec object was not properly randomized.
location:
file: com/abixen/platform/service/businessintelligence/multivisualisation/domain/model/util/AES128Encoder.java
method: "generateKey(String)"
line: 39
internal:
pattern:
crash: false
source:
name:
5 changes: 5 additions & 0 deletions data/abixen-platform/project.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
name: abixen-platform
repository:
type: git
url: https://github.com/abixen/abixen-platform
url: https://github.com/abixen/abixen-platform
16 changes: 16 additions & 0 deletions data/abixen-platform/versions/99fe499/version.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
build:
classes: abixen-platform-business-intelligence-service/target/classes
akwick marked this conversation as resolved.
Show resolved Hide resolved
commands:
- mvn -pl :abixen-platform-web-content-service -am clean install
src: abixen-platform-business-intelligence-service/src/
misuses:
- '1'
- '2'
- '3'
- '4'
- '5'
- '6'
- '7'
- '8'
- '9'
revision: 99fe4994a70be92078545add013bb3bcdc089360
15 changes: 15 additions & 0 deletions data/aliyun-oss-java-sdk/misuses/1/misuse.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
api:
- java.security.MessageDigest
violations:
- insecure/condition/transformation
description: >
First parameter in MessageDigest.getInstance(String) is with value "MD5" which should be any of {SHA-256, SHA-384, SHA-512}.
location:
file: com/aliyun/oss/common/utils/BinaryUtil.java
method: "calculateMd5(byte[])"
line: 43
internal:
pattern:
crash: false
source:
name:
15 changes: 15 additions & 0 deletions data/aliyun-oss-java-sdk/misuses/2/misuse.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
api:
- javax.crypto.spec.SecretKeySpec
violations:
- insecure/condition/randomization
description: >
First parameter while initializing SecretKeySpec object was not properly randomized.
location:
file: com/aliyun/oss/common/utils/BinaryUtil.java
method: "sign(byte[], byte[])"
line: 87
internal:
pattern:
crash: false
source:
name:
5 changes: 5 additions & 0 deletions data/aliyun-oss-java-sdk/project.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
name: aliyun-oss-java-sdk
repository:
type: git
url: https://github.com/aliyun/aliyun-oss-java-sdk
url: https://github.com/aliyun/aliyun-oss-java-sdk
9 changes: 9 additions & 0 deletions data/aliyun-oss-java-sdk/versions/196cf71/version.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
build:
classes: target/classes
commands:
- mvn clean compile
src: /src/main/java/
misuses:
- '1'
- '2'
revision: 196cf711417df73a72e0dc2f84a8f3a03c8371c2
15 changes: 15 additions & 0 deletions data/and-res-guard/misuses/1/misuse.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
api:
- java.security.MessageDigest
violations:
- insecure/condition/transformation
description: >
First parameter (with value "SHA-1") should be any of {SHA-256, SHA-384, SHA-512}
location:
file: main/java/apksigner/ApkSignerTool.java
method: "verify(String[])"
line: 419
internal:
pattern:
crash: false
source:
name:
15 changes: 15 additions & 0 deletions data/and-res-guard/misuses/2/misuse.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
api:
- java.security.MessageDigest
violations:
- insecure/condition/transformation
description: >
First parameter (with value "SHA-1") should be any of {SHA-256, SHA-384, SHA-512}
location:
file: main/java/apksigner/ApkSignerTool.java
method: "verify(String[])"
line: 420
internal:
pattern:
crash: false
source:
name:
5 changes: 5 additions & 0 deletions data/and-res-guard/project.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
name: and-res-guard
repository:
type: git
url: https://github.com/shwenzhang/AndResGuard
url: https://github.com/shwenzhang/AndResGuard
9 changes: 9 additions & 0 deletions data/and-res-guard/versions/f2c72f0/version.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
build:
classes: AndResGuard/AndResGuard-core/build/classes/java/main
commands:
- gradle build
src: AndResGuard/AndResGuard-core/src
misuses:
- '1'
- '2'
revision: f03c69ad2860b5131c5489ca503843172a8f91e4
15 changes: 15 additions & 0 deletions data/app-engine/misuses/1/misuse.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
api:
- javax.crypto.Cipher
violations:
- insecure/condition/transformation
description: >
First parameter (with value "AES") should be any of AES/{CBC, GCM, PCBC, CTR, CTS, CFB, OFB}
location:
file: com/appengine/common/encrypt/AESEncrypter.java
method: "encrypt(String)"
line: 62
internal:
pattern:
crash: false
source:
name:
15 changes: 15 additions & 0 deletions data/app-engine/misuses/2/misuse.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
api:
- javax.crypto.Cipher
violations:
- insecure/condition/transformation
description: >
First parameter (with value "AES") should be any of AES/{CBC, GCM, PCBC, CTR, CTS, CFB, OFB}
location:
file: com/appengine/common/encrypt/AESEncrypter.java
method: "decrypt(String)"
line: 73
internal:
pattern:
crash: false
source:
name:
15 changes: 15 additions & 0 deletions data/app-engine/misuses/3/misuse.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
api:
- javax.crypto.spec.SecretKeySpec
violations:
- insecure/condition/randomization
description: >
First parameter was not properly randomized
location:
file: com/appengine/common/encrypt/AESEncrypter.java
method: "loadAesKey(String)"
line: 98
internal:
pattern:
crash: false
source:
name:
15 changes: 15 additions & 0 deletions data/app-engine/misuses/4/misuse.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
api:
- java.security.MessageDigest
violations:
- insecure/condition/transformation
description: >
First parameter can have values either MD5 or SHA1 but they should be any of AES/{CBC, GCM, PCBC, CTR, CTS, CFB, OFB}
location:
file: com/appengine/common/encrypt/Digests.java
method: "digest(InputStream, String)"
line: 95
internal:
pattern:
crash: false
source:
name:
5 changes: 5 additions & 0 deletions data/app-engine/project.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
name: app-engine
repository:
type: git
url: https://github.com/sofn/app-engine
url: https://github.com/sofn/app-engine
11 changes: 11 additions & 0 deletions data/app-engine/versions/db6d288/version.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
build:
classes: app-engine/common/build/classes/java/main
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please use the placeholder $gradle.default.classes instead of build/classes/java/main, as this will allow us to leave the dataset as is, should the default binary path of maven change in the future.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Resolved in commit eed60ed.

commands:
- gradle compileJava
src: app-engine/common/src/main/java
misuses:
- '1'
- '2'
- '3'
- '4'
revision: db6d288c182cbda5b4d535be5c95f196c4e5aa9b
Loading