diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml deleted file mode 100644 index 1b24cbe8..00000000 --- a/.github/workflows/build.yaml +++ /dev/null @@ -1,28 +0,0 @@ -name: "build" -on: [push, pull_request] -env: - TRIVY_VERSION: 0.50.2 - BATS_LIB_PATH: '/usr/lib/' -jobs: - build: - name: build - runs-on: ubuntu-20.04 - steps: - - - name: Setup BATS - uses: mig4/setup-bats@v1 - with: - bats-version: 1.7.0 - - - name: Setup Bats libs - uses: brokenpip3/setup-bats-libs@0.1.0 - - - name: Check out code - uses: actions/checkout@v1 - - - name: Install Trivy - run: | - curl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/main/contrib/install.sh | sh -s -- -b /usr/local/bin v${{ env.TRIVY_VERSION }} - - - name: Test - run: BATS_LIB_PATH=${{ env.BATS_LIB_PATH }} bats --recursive --timing . diff --git a/.github/workflows/sync-trivy-checks.yaml b/.github/workflows/sync-trivy-checks.yaml new file mode 100644 index 00000000..266b59ae --- /dev/null +++ b/.github/workflows/sync-trivy-checks.yaml @@ -0,0 +1,24 @@ +name: Sync Trivy Checks + +on: + workflow_dispatch: +env: + IMAGE_NAME: ${{ github.repository_owner }}/trivy-checks-act + REGISTRY: ghcr.io + +jobs: + sync-trivy-checks: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Login to GitHub Packages Container registry + uses: docker/login-action@v3 + with: + registry: ${{ env.REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Copy Trivy Checks + run: | + oras cp ghcr.io/aquasecurity/trivy-checks:0 ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest \ No newline at end of file diff --git a/.github/workflows/sync-trivy-db.yaml b/.github/workflows/sync-trivy-db.yaml new file mode 100644 index 00000000..ef16e424 --- /dev/null +++ b/.github/workflows/sync-trivy-db.yaml @@ -0,0 +1,24 @@ +name: Sync Trivy DB + +on: + workflow_dispatch: +env: + IMAGE_NAME: ${{ github.repository_owner }}/trivy-db-act + REGISTRY: ghcr.io + +jobs: + sync-trivy-db: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Login to GitHub Packages Container registry + uses: docker/login-action@v3 + with: + registry: ${{ env.REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Copy Trivy DB + run: | + oras cp ghcr.io/aquasecurity/trivy-db:2 ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest diff --git a/.github/workflows/sync-trivy-java-db.yaml b/.github/workflows/sync-trivy-java-db.yaml new file mode 100644 index 00000000..53cabdba --- /dev/null +++ b/.github/workflows/sync-trivy-java-db.yaml @@ -0,0 +1,24 @@ +name: Sync Trivy Java DB + +on: + workflow_dispatch: +env: + IMAGE_NAME: ${{ github.repository_owner }}/trivy-java-db-act + REGISTRY: ghcr.io + +jobs: + sync-trivy-db: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Login to GitHub Packages Container registry + uses: docker/login-action@v3 + with: + registry: ${{ env.REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Copy Trivy Java DB + run: | + oras cp ghcr.io/aquasecurity/trivy-java-db:1 ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml new file mode 100644 index 00000000..7a2b0a49 --- /dev/null +++ b/.github/workflows/test.yaml @@ -0,0 +1,29 @@ +name: Test + +on: + push: + pull_request: + workflow_dispatch: + +env: + TRIVY_VERSION: 0.50.2 + BATS_LIB_PATH: '/usr/lib/' + +jobs: + test: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Setup Bats and bats libs + uses: bats-core/bats-action@2.0.0 + + - name: Install Trivy + run: | + curl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/main/contrib/install.sh | sh -s -- -b /usr/local/bin v${{ env.TRIVY_VERSION }} + trivy --version + + - name: Test + run: | + chmod +x entrypoint.sh + bats -r -T . diff --git a/test/data/main.tf b/test/data/config-sarif-report/main.tf similarity index 100% rename from test/data/main.tf rename to test/data/config-sarif-report/main.tf diff --git a/test/data/config-sarif-report/report.sarif b/test/data/config-sarif-report/report.sarif new file mode 100644 index 00000000..0602e452 --- /dev/null +++ b/test/data/config-sarif-report/report.sarif @@ -0,0 +1,512 @@ +{ + "version": "2.1.0", + "$schema": "https://raw.githubusercontent.com/oasis-tcs/sarif-spec/master/Schemata/sarif-schema-2.1.0.json", + "runs": [ + { + "tool": { + "driver": { + "fullName": "Trivy Vulnerability Scanner", + "informationUri": "https://github.com/aquasecurity/trivy", + "name": "Trivy", + "rules": [ + { + "id": "AVD-AWS-0086", + "name": "Misconfiguration", + "shortDescription": { + "text": "S3 Access block should block public ACL" + }, + "fullDescription": { + "text": "\nS3 buckets should block public ACLs on buckets and any objects they contain. By blocking, PUTs with fail if the object has any public ACL a.\n" + }, + "defaultConfiguration": { + "level": "error" + }, + "helpUri": "https://avd.aquasec.com/misconfig/avd-aws-0086", + "help": { + "text": "Misconfiguration AVD-AWS-0086\nType: Terraform Security Check\nSeverity: HIGH\nCheck: S3 Access block should block public ACL\nMessage: No public access block so not blocking public acls\nLink: [AVD-AWS-0086](https://avd.aquasec.com/misconfig/avd-aws-0086)\n\nS3 buckets should block public ACLs on buckets and any objects they contain. By blocking, PUTs with fail if the object has any public ACL a.\n", + "markdown": "**Misconfiguration AVD-AWS-0086**\n| Type | Severity | Check | Message | Link |\n| --- | --- | --- | --- | --- |\n|Terraform Security Check|HIGH|S3 Access block should block public ACL|No public access block so not blocking public acls|[AVD-AWS-0086](https://avd.aquasec.com/misconfig/avd-aws-0086)|\n\n\nS3 buckets should block public ACLs on buckets and any objects they contain. By blocking, PUTs with fail if the object has any public ACL a.\n" + }, + "properties": { + "precision": "very-high", + "security-severity": "8.0", + "tags": [ + "misconfiguration", + "security", + "HIGH" + ] + } + }, + { + "id": "AVD-AWS-0087", + "name": "Misconfiguration", + "shortDescription": { + "text": "S3 Access block should block public policy" + }, + "fullDescription": { + "text": "\nS3 bucket policy should have block public policy to prevent users from putting a policy that enable public access.\n" + }, + "defaultConfiguration": { + "level": "error" + }, + "helpUri": "https://avd.aquasec.com/misconfig/avd-aws-0087", + "help": { + "text": "Misconfiguration AVD-AWS-0087\nType: Terraform Security Check\nSeverity: HIGH\nCheck: S3 Access block should block public policy\nMessage: No public access block so not blocking public policies\nLink: [AVD-AWS-0087](https://avd.aquasec.com/misconfig/avd-aws-0087)\n\nS3 bucket policy should have block public policy to prevent users from putting a policy that enable public access.\n", + "markdown": "**Misconfiguration AVD-AWS-0087**\n| Type | Severity | Check | Message | Link |\n| --- | --- | --- | --- | --- |\n|Terraform Security Check|HIGH|S3 Access block should block public policy|No public access block so not blocking public policies|[AVD-AWS-0087](https://avd.aquasec.com/misconfig/avd-aws-0087)|\n\n\nS3 bucket policy should have block public policy to prevent users from putting a policy that enable public access.\n" + }, + "properties": { + "precision": "very-high", + "security-severity": "8.0", + "tags": [ + "misconfiguration", + "security", + "HIGH" + ] + } + }, + { + "id": "AVD-AWS-0088", + "name": "Misconfiguration", + "shortDescription": { + "text": "Unencrypted S3 bucket." + }, + "fullDescription": { + "text": "S3 Buckets should be encrypted to protect the data that is stored within them if access is compromised." + }, + "defaultConfiguration": { + "level": "error" + }, + "helpUri": "https://avd.aquasec.com/misconfig/avd-aws-0088", + "help": { + "text": "Misconfiguration AVD-AWS-0088\nType: Terraform Security Check\nSeverity: HIGH\nCheck: Unencrypted S3 bucket.\nMessage: Bucket does not have encryption enabled\nLink: [AVD-AWS-0088](https://avd.aquasec.com/misconfig/avd-aws-0088)\nS3 Buckets should be encrypted to protect the data that is stored within them if access is compromised.", + "markdown": "**Misconfiguration AVD-AWS-0088**\n| Type | Severity | Check | Message | Link |\n| --- | --- | --- | --- | --- |\n|Terraform Security Check|HIGH|Unencrypted S3 bucket.|Bucket does not have encryption enabled|[AVD-AWS-0088](https://avd.aquasec.com/misconfig/avd-aws-0088)|\n\nS3 Buckets should be encrypted to protect the data that is stored within them if access is compromised." + }, + "properties": { + "precision": "very-high", + "security-severity": "8.0", + "tags": [ + "misconfiguration", + "security", + "HIGH" + ] + } + }, + { + "id": "AVD-AWS-0089", + "name": "Misconfiguration", + "shortDescription": { + "text": "S3 Bucket Logging" + }, + "fullDescription": { + "text": "Ensures S3 bucket logging is enabled for S3 buckets" + }, + "defaultConfiguration": { + "level": "note" + }, + "helpUri": "https://avd.aquasec.com/misconfig/avd-aws-0089", + "help": { + "text": "Misconfiguration AVD-AWS-0089\nType: Terraform Security Check\nSeverity: LOW\nCheck: S3 Bucket Logging\nMessage: Bucket has logging disabled\nLink: [AVD-AWS-0089](https://avd.aquasec.com/misconfig/avd-aws-0089)\nEnsures S3 bucket logging is enabled for S3 buckets", + "markdown": "**Misconfiguration AVD-AWS-0089**\n| Type | Severity | Check | Message | Link |\n| --- | --- | --- | --- | --- |\n|Terraform Security Check|LOW|S3 Bucket Logging|Bucket has logging disabled|[AVD-AWS-0089](https://avd.aquasec.com/misconfig/avd-aws-0089)|\n\nEnsures S3 bucket logging is enabled for S3 buckets" + }, + "properties": { + "precision": "very-high", + "security-severity": "2.0", + "tags": [ + "misconfiguration", + "security", + "LOW" + ] + } + }, + { + "id": "AVD-AWS-0090", + "name": "Misconfiguration", + "shortDescription": { + "text": "S3 Data should be versioned" + }, + "fullDescription": { + "text": "\nVersioning in Amazon S3 is a means of keeping multiple variants of an object in the same bucket. \nYou can use the S3 Versioning feature to preserve, retrieve, and restore every version of every object stored in your buckets. \nWith versioning you can recover more easily from both unintended user actions and application failures.\n" + }, + "defaultConfiguration": { + "level": "warning" + }, + "helpUri": "https://avd.aquasec.com/misconfig/avd-aws-0090", + "help": { + "text": "Misconfiguration AVD-AWS-0090\nType: Terraform Security Check\nSeverity: MEDIUM\nCheck: S3 Data should be versioned\nMessage: Bucket does not have versioning enabled\nLink: [AVD-AWS-0090](https://avd.aquasec.com/misconfig/avd-aws-0090)\n\nVersioning in Amazon S3 is a means of keeping multiple variants of an object in the same bucket. \nYou can use the S3 Versioning feature to preserve, retrieve, and restore every version of every object stored in your buckets. \nWith versioning you can recover more easily from both unintended user actions and application failures.\n", + "markdown": "**Misconfiguration AVD-AWS-0090**\n| Type | Severity | Check | Message | Link |\n| --- | --- | --- | --- | --- |\n|Terraform Security Check|MEDIUM|S3 Data should be versioned|Bucket does not have versioning enabled|[AVD-AWS-0090](https://avd.aquasec.com/misconfig/avd-aws-0090)|\n\n\nVersioning in Amazon S3 is a means of keeping multiple variants of an object in the same bucket. \nYou can use the S3 Versioning feature to preserve, retrieve, and restore every version of every object stored in your buckets. \nWith versioning you can recover more easily from both unintended user actions and application failures.\n" + }, + "properties": { + "precision": "very-high", + "security-severity": "5.5", + "tags": [ + "misconfiguration", + "security", + "MEDIUM" + ] + } + }, + { + "id": "AVD-AWS-0091", + "name": "Misconfiguration", + "shortDescription": { + "text": "S3 Access Block should Ignore Public Acl" + }, + "fullDescription": { + "text": "\nS3 buckets should ignore public ACLs on buckets and any objects they contain. By ignoring rather than blocking, PUT calls with public ACLs will still be applied but the ACL will be ignored.\n" + }, + "defaultConfiguration": { + "level": "error" + }, + "helpUri": "https://avd.aquasec.com/misconfig/avd-aws-0091", + "help": { + "text": "Misconfiguration AVD-AWS-0091\nType: Terraform Security Check\nSeverity: HIGH\nCheck: S3 Access Block should Ignore Public Acl\nMessage: No public access block so not ignoring public acls\nLink: [AVD-AWS-0091](https://avd.aquasec.com/misconfig/avd-aws-0091)\n\nS3 buckets should ignore public ACLs on buckets and any objects they contain. By ignoring rather than blocking, PUT calls with public ACLs will still be applied but the ACL will be ignored.\n", + "markdown": "**Misconfiguration AVD-AWS-0091**\n| Type | Severity | Check | Message | Link |\n| --- | --- | --- | --- | --- |\n|Terraform Security Check|HIGH|S3 Access Block should Ignore Public Acl|No public access block so not ignoring public acls|[AVD-AWS-0091](https://avd.aquasec.com/misconfig/avd-aws-0091)|\n\n\nS3 buckets should ignore public ACLs on buckets and any objects they contain. By ignoring rather than blocking, PUT calls with public ACLs will still be applied but the ACL will be ignored.\n" + }, + "properties": { + "precision": "very-high", + "security-severity": "8.0", + "tags": [ + "misconfiguration", + "security", + "HIGH" + ] + } + }, + { + "id": "AVD-AWS-0093", + "name": "Misconfiguration", + "shortDescription": { + "text": "S3 Access block should restrict public bucket to limit access" + }, + "fullDescription": { + "text": "S3 buckets should restrict public policies for the bucket. By enabling, the restrict_public_buckets, only the bucket owner and AWS Services can access if it has a public policy." + }, + "defaultConfiguration": { + "level": "error" + }, + "helpUri": "https://avd.aquasec.com/misconfig/avd-aws-0093", + "help": { + "text": "Misconfiguration AVD-AWS-0093\nType: Terraform Security Check\nSeverity: HIGH\nCheck: S3 Access block should restrict public bucket to limit access\nMessage: No public access block so not restricting public buckets\nLink: [AVD-AWS-0093](https://avd.aquasec.com/misconfig/avd-aws-0093)\nS3 buckets should restrict public policies for the bucket. By enabling, the restrict_public_buckets, only the bucket owner and AWS Services can access if it has a public policy.", + "markdown": "**Misconfiguration AVD-AWS-0093**\n| Type | Severity | Check | Message | Link |\n| --- | --- | --- | --- | --- |\n|Terraform Security Check|HIGH|S3 Access block should restrict public bucket to limit access|No public access block so not restricting public buckets|[AVD-AWS-0093](https://avd.aquasec.com/misconfig/avd-aws-0093)|\n\nS3 buckets should restrict public policies for the bucket. By enabling, the restrict_public_buckets, only the bucket owner and AWS Services can access if it has a public policy." + }, + "properties": { + "precision": "very-high", + "security-severity": "8.0", + "tags": [ + "misconfiguration", + "security", + "HIGH" + ] + } + }, + { + "id": "AVD-AWS-0094", + "name": "Misconfiguration", + "shortDescription": { + "text": "S3 buckets should each define an aws_s3_bucket_public_access_block" + }, + "fullDescription": { + "text": "The \u0026#34;block public access\u0026#34; settings in S3 override individual policies that apply to a given bucket, meaning that all public access can be controlled in one central types for that bucket. It is therefore good practice to define these settings for each bucket in order to clearly define the public access that can be allowed for it." + }, + "defaultConfiguration": { + "level": "note" + }, + "helpUri": "https://avd.aquasec.com/misconfig/avd-aws-0094", + "help": { + "text": "Misconfiguration AVD-AWS-0094\nType: Terraform Security Check\nSeverity: LOW\nCheck: S3 buckets should each define an aws_s3_bucket_public_access_block\nMessage: Bucket does not have a corresponding public access block.\nLink: [AVD-AWS-0094](https://avd.aquasec.com/misconfig/avd-aws-0094)\nThe \"block public access\" settings in S3 override individual policies that apply to a given bucket, meaning that all public access can be controlled in one central types for that bucket. It is therefore good practice to define these settings for each bucket in order to clearly define the public access that can be allowed for it.", + "markdown": "**Misconfiguration AVD-AWS-0094**\n| Type | Severity | Check | Message | Link |\n| --- | --- | --- | --- | --- |\n|Terraform Security Check|LOW|S3 buckets should each define an aws_s3_bucket_public_access_block|Bucket does not have a corresponding public access block.|[AVD-AWS-0094](https://avd.aquasec.com/misconfig/avd-aws-0094)|\n\nThe \"block public access\" settings in S3 override individual policies that apply to a given bucket, meaning that all public access can be controlled in one central types for that bucket. It is therefore good practice to define these settings for each bucket in order to clearly define the public access that can be allowed for it." + }, + "properties": { + "precision": "very-high", + "security-severity": "2.0", + "tags": [ + "misconfiguration", + "security", + "LOW" + ] + } + }, + { + "id": "AVD-AWS-0132", + "name": "Misconfiguration", + "shortDescription": { + "text": "S3 encryption should use Customer Managed Keys" + }, + "fullDescription": { + "text": "Encryption using AWS keys provides protection for your S3 buckets. To increase control of the encryption and manage factors like rotation use customer managed keys." + }, + "defaultConfiguration": { + "level": "error" + }, + "helpUri": "https://avd.aquasec.com/misconfig/avd-aws-0132", + "help": { + "text": "Misconfiguration AVD-AWS-0132\nType: Terraform Security Check\nSeverity: HIGH\nCheck: S3 encryption should use Customer Managed Keys\nMessage: Bucket does not encrypt data with a customer managed key.\nLink: [AVD-AWS-0132](https://avd.aquasec.com/misconfig/avd-aws-0132)\nEncryption using AWS keys provides protection for your S3 buckets. To increase control of the encryption and manage factors like rotation use customer managed keys.", + "markdown": "**Misconfiguration AVD-AWS-0132**\n| Type | Severity | Check | Message | Link |\n| --- | --- | --- | --- | --- |\n|Terraform Security Check|HIGH|S3 encryption should use Customer Managed Keys|Bucket does not encrypt data with a customer managed key.|[AVD-AWS-0132](https://avd.aquasec.com/misconfig/avd-aws-0132)|\n\nEncryption using AWS keys provides protection for your S3 buckets. To increase control of the encryption and manage factors like rotation use customer managed keys." + }, + "properties": { + "precision": "very-high", + "security-severity": "8.0", + "tags": [ + "misconfiguration", + "security", + "HIGH" + ] + } + } + ], + "version": "0.50.0" + } + }, + "results": [ + { + "ruleId": "AVD-AWS-0086", + "ruleIndex": 0, + "level": "error", + "message": { + "text": "Artifact: main.tf\nType: terraform\nVulnerability AVD-AWS-0086\nSeverity: HIGH\nMessage: No public access block so not blocking public acls\nLink: [AVD-AWS-0086](https://avd.aquasec.com/misconfig/avd-aws-0086)" + }, + "locations": [ + { + "physicalLocation": { + "artifactLocation": { + "uri": "main.tf", + "uriBaseId": "ROOTPATH" + }, + "region": { + "startLine": 8, + "startColumn": 1, + "endLine": 10, + "endColumn": 1 + } + }, + "message": { + "text": "main.tf" + } + } + ] + }, + { + "ruleId": "AVD-AWS-0087", + "ruleIndex": 1, + "level": "error", + "message": { + "text": "Artifact: main.tf\nType: terraform\nVulnerability AVD-AWS-0087\nSeverity: HIGH\nMessage: No public access block so not blocking public policies\nLink: [AVD-AWS-0087](https://avd.aquasec.com/misconfig/avd-aws-0087)" + }, + "locations": [ + { + "physicalLocation": { + "artifactLocation": { + "uri": "main.tf", + "uriBaseId": "ROOTPATH" + }, + "region": { + "startLine": 8, + "startColumn": 1, + "endLine": 10, + "endColumn": 1 + } + }, + "message": { + "text": "main.tf" + } + } + ] + }, + { + "ruleId": "AVD-AWS-0088", + "ruleIndex": 2, + "level": "error", + "message": { + "text": "Artifact: main.tf\nType: terraform\nVulnerability AVD-AWS-0088\nSeverity: HIGH\nMessage: Bucket does not have encryption enabled\nLink: [AVD-AWS-0088](https://avd.aquasec.com/misconfig/avd-aws-0088)" + }, + "locations": [ + { + "physicalLocation": { + "artifactLocation": { + "uri": "main.tf", + "uriBaseId": "ROOTPATH" + }, + "region": { + "startLine": 8, + "startColumn": 1, + "endLine": 10, + "endColumn": 1 + } + }, + "message": { + "text": "main.tf" + } + } + ] + }, + { + "ruleId": "AVD-AWS-0089", + "ruleIndex": 3, + "level": "note", + "message": { + "text": "Artifact: main.tf\nType: terraform\nVulnerability AVD-AWS-0089\nSeverity: LOW\nMessage: Bucket has logging disabled\nLink: [AVD-AWS-0089](https://avd.aquasec.com/misconfig/avd-aws-0089)" + }, + "locations": [ + { + "physicalLocation": { + "artifactLocation": { + "uri": "main.tf", + "uriBaseId": "ROOTPATH" + }, + "region": { + "startLine": 8, + "startColumn": 1, + "endLine": 10, + "endColumn": 1 + } + }, + "message": { + "text": "main.tf" + } + } + ] + }, + { + "ruleId": "AVD-AWS-0090", + "ruleIndex": 4, + "level": "warning", + "message": { + "text": "Artifact: main.tf\nType: terraform\nVulnerability AVD-AWS-0090\nSeverity: MEDIUM\nMessage: Bucket does not have versioning enabled\nLink: [AVD-AWS-0090](https://avd.aquasec.com/misconfig/avd-aws-0090)" + }, + "locations": [ + { + "physicalLocation": { + "artifactLocation": { + "uri": "main.tf", + "uriBaseId": "ROOTPATH" + }, + "region": { + "startLine": 16, + "startColumn": 1, + "endLine": 16, + "endColumn": 1 + } + }, + "message": { + "text": "main.tf" + } + } + ] + }, + { + "ruleId": "AVD-AWS-0091", + "ruleIndex": 5, + "level": "error", + "message": { + "text": "Artifact: main.tf\nType: terraform\nVulnerability AVD-AWS-0091\nSeverity: HIGH\nMessage: No public access block so not ignoring public acls\nLink: [AVD-AWS-0091](https://avd.aquasec.com/misconfig/avd-aws-0091)" + }, + "locations": [ + { + "physicalLocation": { + "artifactLocation": { + "uri": "main.tf", + "uriBaseId": "ROOTPATH" + }, + "region": { + "startLine": 8, + "startColumn": 1, + "endLine": 10, + "endColumn": 1 + } + }, + "message": { + "text": "main.tf" + } + } + ] + }, + { + "ruleId": "AVD-AWS-0093", + "ruleIndex": 6, + "level": "error", + "message": { + "text": "Artifact: main.tf\nType: terraform\nVulnerability AVD-AWS-0093\nSeverity: HIGH\nMessage: No public access block so not restricting public buckets\nLink: [AVD-AWS-0093](https://avd.aquasec.com/misconfig/avd-aws-0093)" + }, + "locations": [ + { + "physicalLocation": { + "artifactLocation": { + "uri": "main.tf", + "uriBaseId": "ROOTPATH" + }, + "region": { + "startLine": 8, + "startColumn": 1, + "endLine": 10, + "endColumn": 1 + } + }, + "message": { + "text": "main.tf" + } + } + ] + }, + { + "ruleId": "AVD-AWS-0094", + "ruleIndex": 7, + "level": "note", + "message": { + "text": "Artifact: main.tf\nType: terraform\nVulnerability AVD-AWS-0094\nSeverity: LOW\nMessage: Bucket does not have a corresponding public access block.\nLink: [AVD-AWS-0094](https://avd.aquasec.com/misconfig/avd-aws-0094)" + }, + "locations": [ + { + "physicalLocation": { + "artifactLocation": { + "uri": "main.tf", + "uriBaseId": "ROOTPATH" + }, + "region": { + "startLine": 8, + "startColumn": 1, + "endLine": 10, + "endColumn": 1 + } + }, + "message": { + "text": "main.tf" + } + } + ] + }, + { + "ruleId": "AVD-AWS-0132", + "ruleIndex": 8, + "level": "error", + "message": { + "text": "Artifact: main.tf\nType: terraform\nVulnerability AVD-AWS-0132\nSeverity: HIGH\nMessage: Bucket does not encrypt data with a customer managed key.\nLink: [AVD-AWS-0132](https://avd.aquasec.com/misconfig/avd-aws-0132)" + }, + "locations": [ + { + "physicalLocation": { + "artifactLocation": { + "uri": "main.tf", + "uriBaseId": "ROOTPATH" + }, + "region": { + "startLine": 8, + "startColumn": 1, + "endLine": 10, + "endColumn": 1 + } + }, + "message": { + "text": "main.tf" + } + } + ] + } + ], + "columnKind": "utf16CodeUnits", + "originalUriBaseIds": { + "ROOTPATH": { + "uri": "file://D:\\projects\\trivy-action\\test\\data\\config-sarif-report/" + } + } + } + ] +} \ No newline at end of file diff --git a/test/data/config-sarif.test b/test/data/config-sarif.test deleted file mode 100644 index 3189a576..00000000 --- a/test/data/config-sarif.test +++ /dev/null @@ -1,620 +0,0 @@ -{ - "version": "2.1.0", - "$schema": "https://raw.githubusercontent.com/oasis-tcs/sarif-spec/master/Schemata/sarif-schema-2.1.0.json", - "runs": [ - { - "tool": { - "driver": { - "fullName": "Trivy Vulnerability Scanner", - "informationUri": "https://github.com/aquasecurity/trivy", - "name": "Trivy", - "rules": [ - { - "id": "DS002", - "name": "Misconfiguration", - "shortDescription": { - "text": "Image user should not be \u0026#39;root\u0026#39;" - }, - "fullDescription": { - "text": "Running containers with \u0026#39;root\u0026#39; user can lead to a container escape situation. It is a best practice to run containers as non-root users, which can be done by adding a \u0026#39;USER\u0026#39; statement to the Dockerfile." - }, - "defaultConfiguration": { - "level": "error" - }, - "helpUri": "https://avd.aquasec.com/misconfig/ds002", - "help": { - "text": "Misconfiguration DS002\\nType: Dockerfile Security Check\\nSeverity: HIGH\\nCheck: Image user should not be 'root'\\nMessage: Specify at least 1 USER command in Dockerfile with non-root user as argument\\nLink: [DS002](https://avd.aquasec.com/misconfig/ds002)\\nRunning containers with 'root' user can lead to a container escape situation. It is a best practice to run containers as non-root users, which can be done by adding a 'USER' statement to the Dockerfile.", - "markdown": "**Misconfiguration DS002**\\n| Type | Severity | Check | Message | Link |\\n| --- | --- | --- | --- | --- |\\n|Dockerfile Security Check|HIGH|Image user should not be 'root'|Specify at least 1 USER command in Dockerfile with non-root user as argument|[DS002](https://avd.aquasec.com/misconfig/ds002)|\\n\\nRunning containers with 'root' user can lead to a container escape situation. It is a best practice to run containers as non-root users, which can be done by adding a 'USER' statement to the Dockerfile." - }, - "properties": { - "precision": "very-high", - "security-severity": "8.0", - "tags": [ - "misconfiguration", - "security", - "HIGH" - ] - } - }, - { - "id": "DS026", - "name": "Misconfiguration", - "shortDescription": { - "text": "No HEALTHCHECK defined" - }, - "fullDescription": { - "text": "You should add HEALTHCHECK instruction in your docker container images to perform the health check on running containers." - }, - "defaultConfiguration": { - "level": "note" - }, - "helpUri": "https://avd.aquasec.com/misconfig/ds026", - "help": { - "text": "Misconfiguration DS026\\nType: Dockerfile Security Check\\nSeverity: LOW\\nCheck: No HEALTHCHECK defined\\nMessage: Add HEALTHCHECK instruction in your Dockerfile\\nLink: [DS026](https://avd.aquasec.com/misconfig/ds026)\\nYou should add HEALTHCHECK instruction in your docker container images to perform the health check on running containers.", - "markdown": "**Misconfiguration DS026**\\n| Type | Severity | Check | Message | Link |\\n| --- | --- | --- | --- | --- |\\n|Dockerfile Security Check|LOW|No HEALTHCHECK defined|Add HEALTHCHECK instruction in your Dockerfile|[DS026](https://avd.aquasec.com/misconfig/ds026)|\\n\\nYou should add HEALTHCHECK instruction in your docker container images to perform the health check on running containers." - }, - "properties": { - "precision": "very-high", - "security-severity": "2.0", - "tags": [ - "misconfiguration", - "security", - "LOW" - ] - } - }, - { - "id": "AVD-AWS-0086", - "name": "Misconfiguration", - "shortDescription": { - "text": "S3 Access block should block public ACL" - }, - "fullDescription": { - "text": "\nS3 buckets should block public ACLs on buckets and any objects they contain. By blocking, PUTs with fail if the object has any public ACL a.\n" - }, - "defaultConfiguration": { - "level": "error" - }, - "helpUri": "https://avd.aquasec.com/misconfig/avd-aws-0086", - "help": { - "text": "Misconfiguration AVD-AWS-0086\\nType: Terraform Security Check\\nSeverity: HIGH\\nCheck: S3 Access block should block public ACL\\nMessage: No public access block so not blocking public acls\\nLink: [AVD-AWS-0086](https://avd.aquasec.com/misconfig/avd-aws-0086)\\n\nS3 buckets should block public ACLs on buckets and any objects they contain. By blocking, PUTs with fail if the object has any public ACL a.\n", - "markdown": "**Misconfiguration AVD-AWS-0086**\\n| Type | Severity | Check | Message | Link |\\n| --- | --- | --- | --- | --- |\\n|Terraform Security Check|HIGH|S3 Access block should block public ACL|No public access block so not blocking public acls|[AVD-AWS-0086](https://avd.aquasec.com/misconfig/avd-aws-0086)|\\n\\n\nS3 buckets should block public ACLs on buckets and any objects they contain. By blocking, PUTs with fail if the object has any public ACL a.\n" - }, - "properties": { - "precision": "very-high", - "security-severity": "8.0", - "tags": [ - "misconfiguration", - "security", - "HIGH" - ] - } - }, - { - "id": "AVD-AWS-0087", - "name": "Misconfiguration", - "shortDescription": { - "text": "S3 Access block should block public policy" - }, - "fullDescription": { - "text": "\nS3 bucket policy should have block public policy to prevent users from putting a policy that enable public access.\n" - }, - "defaultConfiguration": { - "level": "error" - }, - "helpUri": "https://avd.aquasec.com/misconfig/avd-aws-0087", - "help": { - "text": "Misconfiguration AVD-AWS-0087\\nType: Terraform Security Check\\nSeverity: HIGH\\nCheck: S3 Access block should block public policy\\nMessage: No public access block so not blocking public policies\\nLink: [AVD-AWS-0087](https://avd.aquasec.com/misconfig/avd-aws-0087)\\n\nS3 bucket policy should have block public policy to prevent users from putting a policy that enable public access.\n", - "markdown": "**Misconfiguration AVD-AWS-0087**\\n| Type | Severity | Check | Message | Link |\\n| --- | --- | --- | --- | --- |\\n|Terraform Security Check|HIGH|S3 Access block should block public policy|No public access block so not blocking public policies|[AVD-AWS-0087](https://avd.aquasec.com/misconfig/avd-aws-0087)|\\n\\n\nS3 bucket policy should have block public policy to prevent users from putting a policy that enable public access.\n" - }, - "properties": { - "precision": "very-high", - "security-severity": "8.0", - "tags": [ - "misconfiguration", - "security", - "HIGH" - ] - } - }, - { - "id": "AVD-AWS-0088", - "name": "Misconfiguration", - "shortDescription": { - "text": "Unencrypted S3 bucket." - }, - "fullDescription": { - "text": "S3 Buckets should be encrypted to protect the data that is stored within them if access is compromised." - }, - "defaultConfiguration": { - "level": "error" - }, - "helpUri": "https://avd.aquasec.com/misconfig/avd-aws-0088", - "help": { - "text": "Misconfiguration AVD-AWS-0088\\nType: Terraform Security Check\\nSeverity: HIGH\\nCheck: Unencrypted S3 bucket.\\nMessage: Bucket does not have encryption enabled\\nLink: [AVD-AWS-0088](https://avd.aquasec.com/misconfig/avd-aws-0088)\\nS3 Buckets should be encrypted to protect the data that is stored within them if access is compromised.", - "markdown": "**Misconfiguration AVD-AWS-0088**\\n| Type | Severity | Check | Message | Link |\\n| --- | --- | --- | --- | --- |\\n|Terraform Security Check|HIGH|Unencrypted S3 bucket.|Bucket does not have encryption enabled|[AVD-AWS-0088](https://avd.aquasec.com/misconfig/avd-aws-0088)|\\n\\nS3 Buckets should be encrypted to protect the data that is stored within them if access is compromised." - }, - "properties": { - "precision": "very-high", - "security-severity": "8.0", - "tags": [ - "misconfiguration", - "security", - "HIGH" - ] - } - }, - { - "id": "AVD-AWS-0089", - "name": "Misconfiguration", - "shortDescription": { - "text": "S3 Bucket Logging" - }, - "fullDescription": { - "text": "Ensures S3 bucket logging is enabled for S3 buckets" - }, - "defaultConfiguration": { - "level": "note" - }, - "helpUri": "https://avd.aquasec.com/misconfig/avd-aws-0089", - "help": { - "text": "Misconfiguration AVD-AWS-0089\\nType: Terraform Security Check\\nSeverity: LOW\\nCheck: S3 Bucket Logging\\nMessage: Bucket has logging disabled\\nLink: [AVD-AWS-0089](https://avd.aquasec.com/misconfig/avd-aws-0089)\\nEnsures S3 bucket logging is enabled for S3 buckets", - "markdown": "**Misconfiguration AVD-AWS-0089**\\n| Type | Severity | Check | Message | Link |\\n| --- | --- | --- | --- | --- |\\n|Terraform Security Check|LOW|S3 Bucket Logging|Bucket has logging disabled|[AVD-AWS-0089](https://avd.aquasec.com/misconfig/avd-aws-0089)|\\n\\nEnsures S3 bucket logging is enabled for S3 buckets" - }, - "properties": { - "precision": "very-high", - "security-severity": "2.0", - "tags": [ - "misconfiguration", - "security", - "LOW" - ] - } - }, - { - "id": "AVD-AWS-0090", - "name": "Misconfiguration", - "shortDescription": { - "text": "S3 Data should be versioned" - }, - "fullDescription": { - "text": "\nVersioning in Amazon S3 is a means of keeping multiple variants of an object in the same bucket. \nYou can use the S3 Versioning feature to preserve, retrieve, and restore every version of every object stored in your buckets. \nWith versioning you can recover more easily from both unintended user actions and application failures.\n" - }, - "defaultConfiguration": { - "level": "warning" - }, - "helpUri": "https://avd.aquasec.com/misconfig/avd-aws-0090", - "help": { - "text": "Misconfiguration AVD-AWS-0090\\nType: Terraform Security Check\\nSeverity: MEDIUM\\nCheck: S3 Data should be versioned\\nMessage: Bucket does not have versioning enabled\\nLink: [AVD-AWS-0090](https://avd.aquasec.com/misconfig/avd-aws-0090)\\n\nVersioning in Amazon S3 is a means of keeping multiple variants of an object in the same bucket. \nYou can use the S3 Versioning feature to preserve, retrieve, and restore every version of every object stored in your buckets. \nWith versioning you can recover more easily from both unintended user actions and application failures.\n", - "markdown": "**Misconfiguration AVD-AWS-0090**\\n| Type | Severity | Check | Message | Link |\\n| --- | --- | --- | --- | --- |\\n|Terraform Security Check|MEDIUM|S3 Data should be versioned|Bucket does not have versioning enabled|[AVD-AWS-0090](https://avd.aquasec.com/misconfig/avd-aws-0090)|\\n\\n\nVersioning in Amazon S3 is a means of keeping multiple variants of an object in the same bucket. \nYou can use the S3 Versioning feature to preserve, retrieve, and restore every version of every object stored in your buckets. \nWith versioning you can recover more easily from both unintended user actions and application failures.\n" - }, - "properties": { - "precision": "very-high", - "security-severity": "5.5", - "tags": [ - "misconfiguration", - "security", - "MEDIUM" - ] - } - }, - { - "id": "AVD-AWS-0091", - "name": "Misconfiguration", - "shortDescription": { - "text": "S3 Access Block should Ignore Public Acl" - }, - "fullDescription": { - "text": "\nS3 buckets should ignore public ACLs on buckets and any objects they contain. By ignoring rather than blocking, PUT calls with public ACLs will still be applied but the ACL will be ignored.\n" - }, - "defaultConfiguration": { - "level": "error" - }, - "helpUri": "https://avd.aquasec.com/misconfig/avd-aws-0091", - "help": { - "text": "Misconfiguration AVD-AWS-0091\\nType: Terraform Security Check\\nSeverity: HIGH\\nCheck: S3 Access Block should Ignore Public Acl\\nMessage: No public access block so not ignoring public acls\\nLink: [AVD-AWS-0091](https://avd.aquasec.com/misconfig/avd-aws-0091)\\n\nS3 buckets should ignore public ACLs on buckets and any objects they contain. By ignoring rather than blocking, PUT calls with public ACLs will still be applied but the ACL will be ignored.\n", - "markdown": "**Misconfiguration AVD-AWS-0091**\\n| Type | Severity | Check | Message | Link |\\n| --- | --- | --- | --- | --- |\\n|Terraform Security Check|HIGH|S3 Access Block should Ignore Public Acl|No public access block so not ignoring public acls|[AVD-AWS-0091](https://avd.aquasec.com/misconfig/avd-aws-0091)|\\n\\n\nS3 buckets should ignore public ACLs on buckets and any objects they contain. By ignoring rather than blocking, PUT calls with public ACLs will still be applied but the ACL will be ignored.\n" - }, - "properties": { - "precision": "very-high", - "security-severity": "8.0", - "tags": [ - "misconfiguration", - "security", - "HIGH" - ] - } - }, - { - "id": "AVD-AWS-0093", - "name": "Misconfiguration", - "shortDescription": { - "text": "S3 Access block should restrict public bucket to limit access" - }, - "fullDescription": { - "text": "S3 buckets should restrict public policies for the bucket. By enabling, the restrict_public_buckets, only the bucket owner and AWS Services can access if it has a public policy." - }, - "defaultConfiguration": { - "level": "error" - }, - "helpUri": "https://avd.aquasec.com/misconfig/avd-aws-0093", - "help": { - "text": "Misconfiguration AVD-AWS-0093\\nType: Terraform Security Check\\nSeverity: HIGH\\nCheck: S3 Access block should restrict public bucket to limit access\\nMessage: No public access block so not restricting public buckets\\nLink: [AVD-AWS-0093](https://avd.aquasec.com/misconfig/avd-aws-0093)\\nS3 buckets should restrict public policies for the bucket. By enabling, the restrict_public_buckets, only the bucket owner and AWS Services can access if it has a public policy.", - "markdown": "**Misconfiguration AVD-AWS-0093**\\n| Type | Severity | Check | Message | Link |\\n| --- | --- | --- | --- | --- |\\n|Terraform Security Check|HIGH|S3 Access block should restrict public bucket to limit access|No public access block so not restricting public buckets|[AVD-AWS-0093](https://avd.aquasec.com/misconfig/avd-aws-0093)|\\n\\nS3 buckets should restrict public policies for the bucket. By enabling, the restrict_public_buckets, only the bucket owner and AWS Services can access if it has a public policy." - }, - "properties": { - "precision": "very-high", - "security-severity": "8.0", - "tags": [ - "misconfiguration", - "security", - "HIGH" - ] - } - }, - { - "id": "AVD-AWS-0094", - "name": "Misconfiguration", - "shortDescription": { - "text": "S3 buckets should each define an aws_s3_bucket_public_access_block" - }, - "fullDescription": { - "text": "The \u0026#34;block public access\u0026#34; settings in S3 override individual policies that apply to a given bucket, meaning that all public access can be controlled in one central types for that bucket. It is therefore good practice to define these settings for each bucket in order to clearly define the public access that can be allowed for it." - }, - "defaultConfiguration": { - "level": "note" - }, - "helpUri": "https://avd.aquasec.com/misconfig/avd-aws-0094", - "help": { - "text": "Misconfiguration AVD-AWS-0094\\nType: Terraform Security Check\\nSeverity: LOW\\nCheck: S3 buckets should each define an aws_s3_bucket_public_access_block\\nMessage: Bucket does not have a corresponding public access block.\\nLink: [AVD-AWS-0094](https://avd.aquasec.com/misconfig/avd-aws-0094)\\nThe \"block public access\" settings in S3 override individual policies that apply to a given bucket, meaning that all public access can be controlled in one central types for that bucket. It is therefore good practice to define these settings for each bucket in order to clearly define the public access that can be allowed for it.", - "markdown": "**Misconfiguration AVD-AWS-0094**\\n| Type | Severity | Check | Message | Link |\\n| --- | --- | --- | --- | --- |\\n|Terraform Security Check|LOW|S3 buckets should each define an aws_s3_bucket_public_access_block|Bucket does not have a corresponding public access block.|[AVD-AWS-0094](https://avd.aquasec.com/misconfig/avd-aws-0094)|\\n\\nThe \"block public access\" settings in S3 override individual policies that apply to a given bucket, meaning that all public access can be controlled in one central types for that bucket. It is therefore good practice to define these settings for each bucket in order to clearly define the public access that can be allowed for it." - }, - "properties": { - "precision": "very-high", - "security-severity": "2.0", - "tags": [ - "misconfiguration", - "security", - "LOW" - ] - } - }, - { - "id": "AVD-AWS-0132", - "name": "Misconfiguration", - "shortDescription": { - "text": "S3 encryption should use Customer Managed Keys" - }, - "fullDescription": { - "text": "Encryption using AWS keys provides protection for your S3 buckets. To increase control of the encryption and manage factors like rotation use customer managed keys." - }, - "defaultConfiguration": { - "level": "error" - }, - "helpUri": "https://avd.aquasec.com/misconfig/avd-aws-0132", - "help": { - "text": "Misconfiguration AVD-AWS-0132\\nType: Terraform Security Check\\nSeverity: HIGH\\nCheck: S3 encryption should use Customer Managed Keys\\nMessage: Bucket does not encrypt data with a customer managed key.\\nLink: [AVD-AWS-0132](https://avd.aquasec.com/misconfig/avd-aws-0132)\\nEncryption using AWS keys provides protection for your S3 buckets. To increase control of the encryption and manage factors like rotation use customer managed keys.", - "markdown": "**Misconfiguration AVD-AWS-0132**\\n| Type | Severity | Check | Message | Link |\\n| --- | --- | --- | --- | --- |\\n|Terraform Security Check|HIGH|S3 encryption should use Customer Managed Keys|Bucket does not encrypt data with a customer managed key.|[AVD-AWS-0132](https://avd.aquasec.com/misconfig/avd-aws-0132)|\\n\\nEncryption using AWS keys provides protection for your S3 buckets. To increase control of the encryption and manage factors like rotation use customer managed keys." - }, - "properties": { - "precision": "very-high", - "security-severity": "8.0", - "tags": [ - "misconfiguration", - "security", - "HIGH" - ] - } - } - ], - "version": "0.48.1" - } - }, - "results": [ - { - "ruleId": "DS002", - "ruleIndex": 0, - "level": "error", - "message": { - "text": "Artifact: Dockerfile\\nType: dockerfile\\nVulnerability DS002\\nSeverity: HIGH\\nMessage: Specify at least 1 USER command in Dockerfile with non-root user as argument\\nLink: [DS002](https://avd.aquasec.com/misconfig/ds002)" - }, - "locations": [ - { - "physicalLocation": { - "artifactLocation": { - "uri": "Dockerfile", - "uriBaseId": "ROOTPATH" - }, - "region": { - "startLine": 1, - "startColumn": 1, - "endLine": 1, - "endColumn": 1 - } - }, - "message": { - "text": "Dockerfile" - } - } - ] - }, - { - "ruleId": "DS026", - "ruleIndex": 1, - "level": "note", - "message": { - "text": "Artifact: Dockerfile\\nType: dockerfile\\nVulnerability DS026\\nSeverity: LOW\\nMessage: Add HEALTHCHECK instruction in your Dockerfile\\nLink: [DS026](https://avd.aquasec.com/misconfig/ds026)" - }, - "locations": [ - { - "physicalLocation": { - "artifactLocation": { - "uri": "Dockerfile", - "uriBaseId": "ROOTPATH" - }, - "region": { - "startLine": 1, - "startColumn": 1, - "endLine": 1, - "endColumn": 1 - } - }, - "message": { - "text": "Dockerfile" - } - } - ] - }, - { - "ruleId": "AVD-AWS-0086", - "ruleIndex": 2, - "level": "error", - "message": { - "text": "Artifact: test/data/main.tf\\nType: terraform\\nVulnerability AVD-AWS-0086\\nSeverity: HIGH\\nMessage: No public access block so not blocking public acls\\nLink: [AVD-AWS-0086](https://avd.aquasec.com/misconfig/avd-aws-0086)" - }, - "locations": [ - { - "physicalLocation": { - "artifactLocation": { - "uri": "test/data/main.tf", - "uriBaseId": "ROOTPATH" - }, - "region": { - "startLine": 8, - "startColumn": 1, - "endLine": 10, - "endColumn": 1 - } - }, - "message": { - "text": "test/data/main.tf" - } - } - ] - }, - { - "ruleId": "AVD-AWS-0087", - "ruleIndex": 3, - "level": "error", - "message": { - "text": "Artifact: test/data/main.tf\\nType: terraform\\nVulnerability AVD-AWS-0087\\nSeverity: HIGH\\nMessage: No public access block so not blocking public policies\\nLink: [AVD-AWS-0087](https://avd.aquasec.com/misconfig/avd-aws-0087)" - }, - "locations": [ - { - "physicalLocation": { - "artifactLocation": { - "uri": "test/data/main.tf", - "uriBaseId": "ROOTPATH" - }, - "region": { - "startLine": 8, - "startColumn": 1, - "endLine": 10, - "endColumn": 1 - } - }, - "message": { - "text": "test/data/main.tf" - } - } - ] - }, - { - "ruleId": "AVD-AWS-0088", - "ruleIndex": 4, - "level": "error", - "message": { - "text": "Artifact: test/data/main.tf\\nType: terraform\\nVulnerability AVD-AWS-0088\\nSeverity: HIGH\\nMessage: Bucket does not have encryption enabled\\nLink: [AVD-AWS-0088](https://avd.aquasec.com/misconfig/avd-aws-0088)" - }, - "locations": [ - { - "physicalLocation": { - "artifactLocation": { - "uri": "test/data/main.tf", - "uriBaseId": "ROOTPATH" - }, - "region": { - "startLine": 8, - "startColumn": 1, - "endLine": 10, - "endColumn": 1 - } - }, - "message": { - "text": "test/data/main.tf" - } - } - ] - }, - { - "ruleId": "AVD-AWS-0089", - "ruleIndex": 5, - "level": "note", - "message": { - "text": "Artifact: test/data/main.tf\\nType: terraform\\nVulnerability AVD-AWS-0089\\nSeverity: LOW\\nMessage: Bucket has logging disabled\\nLink: [AVD-AWS-0089](https://avd.aquasec.com/misconfig/avd-aws-0089)" - }, - "locations": [ - { - "physicalLocation": { - "artifactLocation": { - "uri": "test/data/main.tf", - "uriBaseId": "ROOTPATH" - }, - "region": { - "startLine": 8, - "startColumn": 1, - "endLine": 10, - "endColumn": 1 - } - }, - "message": { - "text": "test/data/main.tf" - } - } - ] - }, - { - "ruleId": "AVD-AWS-0090", - "ruleIndex": 6, - "level": "warning", - "message": { - "text": "Artifact: test/data/main.tf\\nType: terraform\\nVulnerability AVD-AWS-0090\\nSeverity: MEDIUM\\nMessage: Bucket does not have versioning enabled\\nLink: [AVD-AWS-0090](https://avd.aquasec.com/misconfig/avd-aws-0090)" - }, - "locations": [ - { - "physicalLocation": { - "artifactLocation": { - "uri": "test/data/main.tf", - "uriBaseId": "ROOTPATH" - }, - "region": { - "startLine": 16, - "startColumn": 1, - "endLine": 16, - "endColumn": 1 - } - }, - "message": { - "text": "test/data/main.tf" - } - } - ] - }, - { - "ruleId": "AVD-AWS-0091", - "ruleIndex": 7, - "level": "error", - "message": { - "text": "Artifact: test/data/main.tf\\nType: terraform\\nVulnerability AVD-AWS-0091\\nSeverity: HIGH\\nMessage: No public access block so not ignoring public acls\\nLink: [AVD-AWS-0091](https://avd.aquasec.com/misconfig/avd-aws-0091)" - }, - "locations": [ - { - "physicalLocation": { - "artifactLocation": { - "uri": "test/data/main.tf", - "uriBaseId": "ROOTPATH" - }, - "region": { - "startLine": 8, - "startColumn": 1, - "endLine": 10, - "endColumn": 1 - } - }, - "message": { - "text": "test/data/main.tf" - } - } - ] - }, - { - "ruleId": "AVD-AWS-0093", - "ruleIndex": 8, - "level": "error", - "message": { - "text": "Artifact: test/data/main.tf\\nType: terraform\\nVulnerability AVD-AWS-0093\\nSeverity: HIGH\\nMessage: No public access block so not restricting public buckets\\nLink: [AVD-AWS-0093](https://avd.aquasec.com/misconfig/avd-aws-0093)" - }, - "locations": [ - { - "physicalLocation": { - "artifactLocation": { - "uri": "test/data/main.tf", - "uriBaseId": "ROOTPATH" - }, - "region": { - "startLine": 8, - "startColumn": 1, - "endLine": 10, - "endColumn": 1 - } - }, - "message": { - "text": "test/data/main.tf" - } - } - ] - }, - { - "ruleId": "AVD-AWS-0094", - "ruleIndex": 9, - "level": "note", - "message": { - "text": "Artifact: test/data/main.tf\\nType: terraform\\nVulnerability AVD-AWS-0094\\nSeverity: LOW\\nMessage: Bucket does not have a corresponding public access block.\\nLink: [AVD-AWS-0094](https://avd.aquasec.com/misconfig/avd-aws-0094)" - }, - "locations": [ - { - "physicalLocation": { - "artifactLocation": { - "uri": "test/data/main.tf", - "uriBaseId": "ROOTPATH" - }, - "region": { - "startLine": 8, - "startColumn": 1, - "endLine": 10, - "endColumn": 1 - } - }, - "message": { - "text": "test/data/main.tf" - } - } - ] - }, - { - "ruleId": "AVD-AWS-0132", - "ruleIndex": 10, - "level": "error", - "message": { - "text": "Artifact: test/data/main.tf\\nType: terraform\\nVulnerability AVD-AWS-0132\\nSeverity: HIGH\\nMessage: Bucket does not encrypt data with a customer managed key.\\nLink: [AVD-AWS-0132](https://avd.aquasec.com/misconfig/avd-aws-0132)" - }, - "locations": [ - { - "physicalLocation": { - "artifactLocation": { - "uri": "test/data/main.tf", - "uriBaseId": "ROOTPATH" - }, - "region": { - "startLine": 8, - "startColumn": 1, - "endLine": 10, - "endColumn": 1 - } - }, - "message": { - "text": "test/data/main.tf" - } - } - ] - } - ], - "columnKind": "utf16CodeUnits", - "originalUriBaseIds": { - "ROOTPATH": { - "uri": "file:///home/runner/work/trivy-action/trivy-action/" - } - } - } - ] -} \ No newline at end of file diff --git a/test/data/config-scan/main.tf b/test/data/config-scan/main.tf new file mode 100644 index 00000000..85208bb2 --- /dev/null +++ b/test/data/config-scan/main.tf @@ -0,0 +1,18 @@ +# test data for trivy config with terraform variables + +variable "bucket_versioning_enabled" { + type = string + default = "Disabled" +} + +resource "aws_s3_bucket" "bucket" { + bucket = "trivy-action-bucket" +} + +resource "aws_s3_bucket_versioning" "bucket_versioning" { + bucket = aws_s3_bucket.bucket.id + + versioning_configuration { + status = var.bucket_versioning_enabled + } +} \ No newline at end of file diff --git a/test/data/config.test b/test/data/config-scan/report.json similarity index 90% rename from test/data/config.test rename to test/data/config-scan/report.json index 5a3b830e..61c7dc88 100644 --- a/test/data/config.test +++ b/test/data/config-scan/report.json @@ -1,7 +1,7 @@ { "SchemaVersion": 2, - "CreatedAt": "2024-01-02T23:40:12.036390742Z", - "ArtifactName": ".", + "CreatedAt": "2024-04-12T16:53:35.5567541+03:00", + "ArtifactName": "test/data/config-scan", "ArtifactType": "filesystem", "Metadata": { "ImageConfig": { @@ -17,71 +17,7 @@ }, "Results": [ { - "Target": "Dockerfile", - "Class": "config", - "Type": "dockerfile", - "MisconfSummary": { - "Successes": 24, - "Failures": 2, - "Exceptions": 0 - }, - "Misconfigurations": [ - { - "Type": "Dockerfile Security Check", - "ID": "DS002", - "AVDID": "AVD-DS-0002", - "Title": "Image user should not be 'root'", - "Description": "Running containers with 'root' user can lead to a container escape situation. It is a best practice to run containers as non-root users, which can be done by adding a 'USER' statement to the Dockerfile.", - "Message": "Specify at least 1 USER command in Dockerfile with non-root user as argument", - "Namespace": "builtin.dockerfile.DS002", - "Query": "data.builtin.dockerfile.DS002.deny", - "Resolution": "Add 'USER \u003cnon root user name\u003e' line to the Dockerfile", - "Severity": "HIGH", - "PrimaryURL": "https://avd.aquasec.com/misconfig/ds002", - "References": [ - "https://docs.docker.com/develop/develop-images/dockerfile_best-practices/", - "https://avd.aquasec.com/misconfig/ds002" - ], - "Status": "FAIL", - "Layer": {}, - "CauseMetadata": { - "Provider": "Dockerfile", - "Service": "general", - "Code": { - "Lines": null - } - } - }, - { - "Type": "Dockerfile Security Check", - "ID": "DS026", - "AVDID": "AVD-DS-0026", - "Title": "No HEALTHCHECK defined", - "Description": "You should add HEALTHCHECK instruction in your docker container images to perform the health check on running containers.", - "Message": "Add HEALTHCHECK instruction in your Dockerfile", - "Namespace": "builtin.dockerfile.DS026", - "Query": "data.builtin.dockerfile.DS026.deny", - "Resolution": "Add HEALTHCHECK instruction in Dockerfile", - "Severity": "LOW", - "PrimaryURL": "https://avd.aquasec.com/misconfig/ds026", - "References": [ - "https://blog.aquasec.com/docker-security-best-practices", - "https://avd.aquasec.com/misconfig/ds026" - ], - "Status": "FAIL", - "Layer": {}, - "CauseMetadata": { - "Provider": "Dockerfile", - "Service": "general", - "Code": { - "Lines": null - } - } - } - ] - }, - { - "Target": "test/data", + "Target": ".", "Class": "config", "Type": "terraform", "MisconfSummary": { @@ -91,7 +27,7 @@ } }, { - "Target": "test/data/main.tf", + "Target": "main.tf", "Class": "config", "Type": "terraform", "MisconfSummary": { @@ -436,7 +372,7 @@ "Occurrences": [ { "Resource": "versioning_configuration", - "Filename": "test/data/main.tf", + "Filename": "main.tf", "Location": { "StartLine": 15, "EndLine": 17 @@ -444,7 +380,7 @@ }, { "Resource": "aws_s3_bucket_versioning.bucket_versioning", - "Filename": "test/data/main.tf", + "Filename": "main.tf", "Location": { "StartLine": 12, "EndLine": 18 diff --git a/test/data/fs.test b/test/data/fs-scan/report similarity index 100% rename from test/data/fs.test rename to test/data/fs-scan/report diff --git a/test/data/fs-scheck.test b/test/data/fs-scheck.test deleted file mode 100644 index da0a280f..00000000 --- a/test/data/fs-scheck.test +++ /dev/null @@ -1,695 +0,0 @@ -{ - "SchemaVersion": 2, - "CreatedAt": "2024-01-02T23:40:15.166517221Z", - "ArtifactName": ".", - "ArtifactType": "filesystem", - "Metadata": { - "ImageConfig": { - "architecture": "", - "created": "0001-01-01T00:00:00Z", - "os": "", - "rootfs": { - "type": "", - "diff_ids": null - }, - "config": {} - } - }, - "Results": [ - { - "Target": "Dockerfile", - "Class": "config", - "Type": "dockerfile", - "MisconfSummary": { - "Successes": 24, - "Failures": 2, - "Exceptions": 0 - }, - "Misconfigurations": [ - { - "Type": "Dockerfile Security Check", - "ID": "DS002", - "AVDID": "AVD-DS-0002", - "Title": "Image user should not be 'root'", - "Description": "Running containers with 'root' user can lead to a container escape situation. It is a best practice to run containers as non-root users, which can be done by adding a 'USER' statement to the Dockerfile.", - "Message": "Specify at least 1 USER command in Dockerfile with non-root user as argument", - "Namespace": "builtin.dockerfile.DS002", - "Query": "data.builtin.dockerfile.DS002.deny", - "Resolution": "Add 'USER \u003cnon root user name\u003e' line to the Dockerfile", - "Severity": "HIGH", - "PrimaryURL": "https://avd.aquasec.com/misconfig/ds002", - "References": [ - "https://docs.docker.com/develop/develop-images/dockerfile_best-practices/", - "https://avd.aquasec.com/misconfig/ds002" - ], - "Status": "FAIL", - "Layer": {}, - "CauseMetadata": { - "Provider": "Dockerfile", - "Service": "general", - "Code": { - "Lines": null - } - } - }, - { - "Type": "Dockerfile Security Check", - "ID": "DS026", - "AVDID": "AVD-DS-0026", - "Title": "No HEALTHCHECK defined", - "Description": "You should add HEALTHCHECK instruction in your docker container images to perform the health check on running containers.", - "Message": "Add HEALTHCHECK instruction in your Dockerfile", - "Namespace": "builtin.dockerfile.DS026", - "Query": "data.builtin.dockerfile.DS026.deny", - "Resolution": "Add HEALTHCHECK instruction in Dockerfile", - "Severity": "LOW", - "PrimaryURL": "https://avd.aquasec.com/misconfig/ds026", - "References": [ - "https://blog.aquasec.com/docker-security-best-practices", - "https://avd.aquasec.com/misconfig/ds026" - ], - "Status": "FAIL", - "Layer": {}, - "CauseMetadata": { - "Provider": "Dockerfile", - "Service": "general", - "Code": { - "Lines": null - } - } - } - ] - }, - { - "Target": "test/data", - "Class": "config", - "Type": "terraform", - "MisconfSummary": { - "Successes": 2, - "Failures": 0, - "Exceptions": 0 - } - }, - { - "Target": "test/data/main.tf", - "Class": "config", - "Type": "terraform", - "MisconfSummary": { - "Successes": 1, - "Failures": 9, - "Exceptions": 0 - }, - "Misconfigurations": [ - { - "Type": "Terraform Security Check", - "ID": "AVD-AWS-0086", - "AVDID": "AVD-AWS-0086", - "Title": "S3 Access block should block public ACL", - "Description": "\nS3 buckets should block public ACLs on buckets and any objects they contain. By blocking, PUTs with fail if the object has any public ACL a.\n", - "Message": "No public access block so not blocking public acls", - "Query": "data..", - "Resolution": "Enable blocking any PUT calls with a public ACL specified", - "Severity": "HIGH", - "PrimaryURL": "https://avd.aquasec.com/misconfig/avd-aws-0086", - "References": [ - "https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-control-block-public-access.html", - "https://avd.aquasec.com/misconfig/avd-aws-0086" - ], - "Status": "FAIL", - "Layer": {}, - "CauseMetadata": { - "Resource": "aws_s3_bucket.bucket", - "Provider": "AWS", - "Service": "s3", - "StartLine": 8, - "EndLine": 10, - "Code": { - "Lines": [ - { - "Number": 8, - "Content": "resource \"aws_s3_bucket\" \"bucket\" {", - "IsCause": true, - "Annotation": "", - "Truncated": false, - "Highlighted": "\u001b[38;5;33mresource\u001b[0m \u001b[38;5;37m\"aws_s3_bucket\"\u001b[0m \u001b[38;5;37m\"bucket\"\u001b[0m {", - "FirstCause": true, - "LastCause": false - }, - { - "Number": 9, - "Content": " bucket = \"trivy-action-bucket\"", - "IsCause": true, - "Annotation": "", - "Truncated": false, - "Highlighted": " \u001b[38;5;245mbucket\u001b[0m = \u001b[38;5;37m\"trivy-action-bucket\"", - "FirstCause": false, - "LastCause": false - }, - { - "Number": 10, - "Content": "}", - "IsCause": true, - "Annotation": "", - "Truncated": false, - "Highlighted": "\u001b[0m}", - "FirstCause": false, - "LastCause": true - } - ] - } - } - }, - { - "Type": "Terraform Security Check", - "ID": "AVD-AWS-0087", - "AVDID": "AVD-AWS-0087", - "Title": "S3 Access block should block public policy", - "Description": "\nS3 bucket policy should have block public policy to prevent users from putting a policy that enable public access.\n", - "Message": "No public access block so not blocking public policies", - "Query": "data..", - "Resolution": "Prevent policies that allow public access being PUT", - "Severity": "HIGH", - "PrimaryURL": "https://avd.aquasec.com/misconfig/avd-aws-0087", - "References": [ - "https://docs.aws.amazon.com/AmazonS3/latest/dev-retired/access-control-block-public-access.html", - "https://avd.aquasec.com/misconfig/avd-aws-0087" - ], - "Status": "FAIL", - "Layer": {}, - "CauseMetadata": { - "Resource": "aws_s3_bucket.bucket", - "Provider": "AWS", - "Service": "s3", - "StartLine": 8, - "EndLine": 10, - "Code": { - "Lines": [ - { - "Number": 8, - "Content": "resource \"aws_s3_bucket\" \"bucket\" {", - "IsCause": true, - "Annotation": "", - "Truncated": false, - "Highlighted": "\u001b[38;5;33mresource\u001b[0m \u001b[38;5;37m\"aws_s3_bucket\"\u001b[0m \u001b[38;5;37m\"bucket\"\u001b[0m {", - "FirstCause": true, - "LastCause": false - }, - { - "Number": 9, - "Content": " bucket = \"trivy-action-bucket\"", - "IsCause": true, - "Annotation": "", - "Truncated": false, - "Highlighted": " \u001b[38;5;245mbucket\u001b[0m = \u001b[38;5;37m\"trivy-action-bucket\"", - "FirstCause": false, - "LastCause": false - }, - { - "Number": 10, - "Content": "}", - "IsCause": true, - "Annotation": "", - "Truncated": false, - "Highlighted": "\u001b[0m}", - "FirstCause": false, - "LastCause": true - } - ] - } - } - }, - { - "Type": "Terraform Security Check", - "ID": "AVD-AWS-0088", - "AVDID": "AVD-AWS-0088", - "Title": "Unencrypted S3 bucket.", - "Description": "S3 Buckets should be encrypted to protect the data that is stored within them if access is compromised.", - "Message": "Bucket does not have encryption enabled", - "Query": "data..", - "Resolution": "Configure bucket encryption", - "Severity": "HIGH", - "PrimaryURL": "https://avd.aquasec.com/misconfig/avd-aws-0088", - "References": [ - "https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucket-encryption.html", - "https://avd.aquasec.com/misconfig/avd-aws-0088" - ], - "Status": "FAIL", - "Layer": {}, - "CauseMetadata": { - "Resource": "aws_s3_bucket.bucket", - "Provider": "AWS", - "Service": "s3", - "StartLine": 8, - "EndLine": 10, - "Code": { - "Lines": [ - { - "Number": 8, - "Content": "resource \"aws_s3_bucket\" \"bucket\" {", - "IsCause": true, - "Annotation": "", - "Truncated": false, - "Highlighted": "\u001b[38;5;33mresource\u001b[0m \u001b[38;5;37m\"aws_s3_bucket\"\u001b[0m \u001b[38;5;37m\"bucket\"\u001b[0m {", - "FirstCause": true, - "LastCause": false - }, - { - "Number": 9, - "Content": " bucket = \"trivy-action-bucket\"", - "IsCause": true, - "Annotation": "", - "Truncated": false, - "Highlighted": " \u001b[38;5;245mbucket\u001b[0m = \u001b[38;5;37m\"trivy-action-bucket\"", - "FirstCause": false, - "LastCause": false - }, - { - "Number": 10, - "Content": "}", - "IsCause": true, - "Annotation": "", - "Truncated": false, - "Highlighted": "\u001b[0m}", - "FirstCause": false, - "LastCause": true - } - ] - } - } - }, - { - "Type": "Terraform Security Check", - "ID": "AVD-AWS-0089", - "AVDID": "AVD-AWS-0089", - "Title": "S3 Bucket Logging", - "Description": "Ensures S3 bucket logging is enabled for S3 buckets", - "Message": "Bucket has logging disabled", - "Namespace": "builtin.aws.s3.aws0089", - "Query": "data.builtin.aws.s3.aws0089.deny", - "Resolution": "Add a logging block to the resource to enable access logging", - "Severity": "LOW", - "PrimaryURL": "https://avd.aquasec.com/misconfig/avd-aws-0089", - "References": [ - "https://docs.aws.amazon.com/AmazonS3/latest/userguide/ServerLogs.html", - "https://avd.aquasec.com/misconfig/avd-aws-0089" - ], - "Status": "FAIL", - "Layer": {}, - "CauseMetadata": { - "Resource": "aws_s3_bucket.bucket", - "Provider": "AWS", - "Service": "s3", - "StartLine": 8, - "EndLine": 10, - "Code": { - "Lines": [ - { - "Number": 8, - "Content": "resource \"aws_s3_bucket\" \"bucket\" {", - "IsCause": true, - "Annotation": "", - "Truncated": false, - "Highlighted": "\u001b[38;5;33mresource\u001b[0m \u001b[38;5;37m\"aws_s3_bucket\"\u001b[0m \u001b[38;5;37m\"bucket\"\u001b[0m {", - "FirstCause": true, - "LastCause": false - }, - { - "Number": 9, - "Content": " bucket = \"trivy-action-bucket\"", - "IsCause": true, - "Annotation": "", - "Truncated": false, - "Highlighted": " \u001b[38;5;245mbucket\u001b[0m = \u001b[38;5;37m\"trivy-action-bucket\"", - "FirstCause": false, - "LastCause": false - }, - { - "Number": 10, - "Content": "}", - "IsCause": true, - "Annotation": "", - "Truncated": false, - "Highlighted": "\u001b[0m}", - "FirstCause": false, - "LastCause": true - } - ] - } - } - }, - { - "Type": "Terraform Security Check", - "ID": "AVD-AWS-0090", - "AVDID": "AVD-AWS-0090", - "Title": "S3 Data should be versioned", - "Description": "\nVersioning in Amazon S3 is a means of keeping multiple variants of an object in the same bucket. \nYou can use the S3 Versioning feature to preserve, retrieve, and restore every version of every object stored in your buckets. \nWith versioning you can recover more easily from both unintended user actions and application failures.\n", - "Message": "Bucket does not have versioning enabled", - "Query": "data..", - "Resolution": "Enable versioning to protect against accidental/malicious removal or modification", - "Severity": "MEDIUM", - "PrimaryURL": "https://avd.aquasec.com/misconfig/avd-aws-0090", - "References": [ - "https://docs.aws.amazon.com/AmazonS3/latest/userguide/Versioning.html", - "https://avd.aquasec.com/misconfig/avd-aws-0090" - ], - "Status": "FAIL", - "Layer": {}, - "CauseMetadata": { - "Resource": "aws_s3_bucket_versioning.bucket_versioning", - "Provider": "AWS", - "Service": "s3", - "StartLine": 16, - "EndLine": 16, - "Code": { - "Lines": [ - { - "Number": 12, - "Content": "resource \"aws_s3_bucket_versioning\" \"bucket_versioning\" {", - "IsCause": false, - "Annotation": "", - "Truncated": false, - "Highlighted": "\u001b[38;5;33mresource\u001b[0m \u001b[38;5;37m\"aws_s3_bucket_versioning\"\u001b[0m \u001b[38;5;37m\"bucket_versioning\"\u001b[0m {", - "FirstCause": false, - "LastCause": false - }, - { - "Number": 13, - "Content": " bucket = aws_s3_bucket.bucket.id", - "IsCause": false, - "Annotation": "", - "Truncated": false, - "Highlighted": " \u001b[38;5;245mbucket\u001b[0m = aws_s3_bucket.bucket.id", - "FirstCause": false, - "LastCause": false - }, - { - "Number": 14, - "Content": "", - "IsCause": false, - "Annotation": "", - "Truncated": false, - "FirstCause": false, - "LastCause": false - }, - { - "Number": 15, - "Content": " versioning_configuration {", - "IsCause": false, - "Annotation": "", - "Truncated": false, - "Highlighted": " versioning_configuration {", - "FirstCause": false, - "LastCause": false - }, - { - "Number": 16, - "Content": " status = var.bucket_versioning_enabled", - "IsCause": true, - "Annotation": "", - "Truncated": false, - "Highlighted": " \u001b[38;5;245mstatus\u001b[0m = \u001b[38;5;33mvar\u001b[0m.bucket_versioning_enabled", - "FirstCause": true, - "LastCause": true - }, - { - "Number": 17, - "Content": " }", - "IsCause": false, - "Annotation": "", - "Truncated": false, - "Highlighted": " }", - "FirstCause": false, - "LastCause": false - }, - { - "Number": 18, - "Content": "}", - "IsCause": false, - "Annotation": "", - "Truncated": false, - "Highlighted": "}", - "FirstCause": false, - "LastCause": false - } - ] - }, - "Occurrences": [ - { - "Resource": "versioning_configuration", - "Filename": "test/data/main.tf", - "Location": { - "StartLine": 15, - "EndLine": 17 - } - }, - { - "Resource": "aws_s3_bucket_versioning.bucket_versioning", - "Filename": "test/data/main.tf", - "Location": { - "StartLine": 12, - "EndLine": 18 - } - } - ] - } - }, - { - "Type": "Terraform Security Check", - "ID": "AVD-AWS-0091", - "AVDID": "AVD-AWS-0091", - "Title": "S3 Access Block should Ignore Public Acl", - "Description": "\nS3 buckets should ignore public ACLs on buckets and any objects they contain. By ignoring rather than blocking, PUT calls with public ACLs will still be applied but the ACL will be ignored.\n", - "Message": "No public access block so not ignoring public acls", - "Query": "data..", - "Resolution": "Enable ignoring the application of public ACLs in PUT calls", - "Severity": "HIGH", - "PrimaryURL": "https://avd.aquasec.com/misconfig/avd-aws-0091", - "References": [ - "https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-control-block-public-access.html", - "https://avd.aquasec.com/misconfig/avd-aws-0091" - ], - "Status": "FAIL", - "Layer": {}, - "CauseMetadata": { - "Resource": "aws_s3_bucket.bucket", - "Provider": "AWS", - "Service": "s3", - "StartLine": 8, - "EndLine": 10, - "Code": { - "Lines": [ - { - "Number": 8, - "Content": "resource \"aws_s3_bucket\" \"bucket\" {", - "IsCause": true, - "Annotation": "", - "Truncated": false, - "Highlighted": "\u001b[38;5;33mresource\u001b[0m \u001b[38;5;37m\"aws_s3_bucket\"\u001b[0m \u001b[38;5;37m\"bucket\"\u001b[0m {", - "FirstCause": true, - "LastCause": false - }, - { - "Number": 9, - "Content": " bucket = \"trivy-action-bucket\"", - "IsCause": true, - "Annotation": "", - "Truncated": false, - "Highlighted": " \u001b[38;5;245mbucket\u001b[0m = \u001b[38;5;37m\"trivy-action-bucket\"", - "FirstCause": false, - "LastCause": false - }, - { - "Number": 10, - "Content": "}", - "IsCause": true, - "Annotation": "", - "Truncated": false, - "Highlighted": "\u001b[0m}", - "FirstCause": false, - "LastCause": true - } - ] - } - } - }, - { - "Type": "Terraform Security Check", - "ID": "AVD-AWS-0093", - "AVDID": "AVD-AWS-0093", - "Title": "S3 Access block should restrict public bucket to limit access", - "Description": "S3 buckets should restrict public policies for the bucket. By enabling, the restrict_public_buckets, only the bucket owner and AWS Services can access if it has a public policy.", - "Message": "No public access block so not restricting public buckets", - "Query": "data..", - "Resolution": "Limit the access to public buckets to only the owner or AWS Services (eg; CloudFront)", - "Severity": "HIGH", - "PrimaryURL": "https://avd.aquasec.com/misconfig/avd-aws-0093", - "References": [ - "https://docs.aws.amazon.com/AmazonS3/latest/dev-retired/access-control-block-public-access.html", - "https://avd.aquasec.com/misconfig/avd-aws-0093" - ], - "Status": "FAIL", - "Layer": {}, - "CauseMetadata": { - "Resource": "aws_s3_bucket.bucket", - "Provider": "AWS", - "Service": "s3", - "StartLine": 8, - "EndLine": 10, - "Code": { - "Lines": [ - { - "Number": 8, - "Content": "resource \"aws_s3_bucket\" \"bucket\" {", - "IsCause": true, - "Annotation": "", - "Truncated": false, - "Highlighted": "\u001b[38;5;33mresource\u001b[0m \u001b[38;5;37m\"aws_s3_bucket\"\u001b[0m \u001b[38;5;37m\"bucket\"\u001b[0m {", - "FirstCause": true, - "LastCause": false - }, - { - "Number": 9, - "Content": " bucket = \"trivy-action-bucket\"", - "IsCause": true, - "Annotation": "", - "Truncated": false, - "Highlighted": " \u001b[38;5;245mbucket\u001b[0m = \u001b[38;5;37m\"trivy-action-bucket\"", - "FirstCause": false, - "LastCause": false - }, - { - "Number": 10, - "Content": "}", - "IsCause": true, - "Annotation": "", - "Truncated": false, - "Highlighted": "\u001b[0m}", - "FirstCause": false, - "LastCause": true - } - ] - } - } - }, - { - "Type": "Terraform Security Check", - "ID": "AVD-AWS-0094", - "AVDID": "AVD-AWS-0094", - "Title": "S3 buckets should each define an aws_s3_bucket_public_access_block", - "Description": "The \"block public access\" settings in S3 override individual policies that apply to a given bucket, meaning that all public access can be controlled in one central types for that bucket. It is therefore good practice to define these settings for each bucket in order to clearly define the public access that can be allowed for it.", - "Message": "Bucket does not have a corresponding public access block.", - "Query": "data..", - "Resolution": "Define a aws_s3_bucket_public_access_block for the given bucket to control public access policies", - "Severity": "LOW", - "PrimaryURL": "https://avd.aquasec.com/misconfig/avd-aws-0094", - "References": [ - "https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-control-block-public-access.html", - "https://avd.aquasec.com/misconfig/avd-aws-0094" - ], - "Status": "FAIL", - "Layer": {}, - "CauseMetadata": { - "Resource": "aws_s3_bucket.bucket", - "Provider": "AWS", - "Service": "s3", - "StartLine": 8, - "EndLine": 10, - "Code": { - "Lines": [ - { - "Number": 8, - "Content": "resource \"aws_s3_bucket\" \"bucket\" {", - "IsCause": true, - "Annotation": "", - "Truncated": false, - "Highlighted": "\u001b[38;5;33mresource\u001b[0m \u001b[38;5;37m\"aws_s3_bucket\"\u001b[0m \u001b[38;5;37m\"bucket\"\u001b[0m {", - "FirstCause": true, - "LastCause": false - }, - { - "Number": 9, - "Content": " bucket = \"trivy-action-bucket\"", - "IsCause": true, - "Annotation": "", - "Truncated": false, - "Highlighted": " \u001b[38;5;245mbucket\u001b[0m = \u001b[38;5;37m\"trivy-action-bucket\"", - "FirstCause": false, - "LastCause": false - }, - { - "Number": 10, - "Content": "}", - "IsCause": true, - "Annotation": "", - "Truncated": false, - "Highlighted": "\u001b[0m}", - "FirstCause": false, - "LastCause": true - } - ] - } - } - }, - { - "Type": "Terraform Security Check", - "ID": "AVD-AWS-0132", - "AVDID": "AVD-AWS-0132", - "Title": "S3 encryption should use Customer Managed Keys", - "Description": "Encryption using AWS keys provides protection for your S3 buckets. To increase control of the encryption and manage factors like rotation use customer managed keys.", - "Message": "Bucket does not encrypt data with a customer managed key.", - "Query": "data..", - "Resolution": "Enable encryption using customer managed keys", - "Severity": "HIGH", - "PrimaryURL": "https://avd.aquasec.com/misconfig/avd-aws-0132", - "References": [ - "https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucket-encryption.html", - "https://avd.aquasec.com/misconfig/avd-aws-0132" - ], - "Status": "FAIL", - "Layer": {}, - "CauseMetadata": { - "Resource": "aws_s3_bucket.bucket", - "Provider": "AWS", - "Service": "s3", - "StartLine": 8, - "EndLine": 10, - "Code": { - "Lines": [ - { - "Number": 8, - "Content": "resource \"aws_s3_bucket\" \"bucket\" {", - "IsCause": true, - "Annotation": "", - "Truncated": false, - "Highlighted": "\u001b[38;5;33mresource\u001b[0m \u001b[38;5;37m\"aws_s3_bucket\"\u001b[0m \u001b[38;5;37m\"bucket\"\u001b[0m {", - "FirstCause": true, - "LastCause": false - }, - { - "Number": 9, - "Content": " bucket = \"trivy-action-bucket\"", - "IsCause": true, - "Annotation": "", - "Truncated": false, - "Highlighted": " \u001b[38;5;245mbucket\u001b[0m = \u001b[38;5;37m\"trivy-action-bucket\"", - "FirstCause": false, - "LastCause": false - }, - { - "Number": 10, - "Content": "}", - "IsCause": true, - "Annotation": "", - "Truncated": false, - "Highlighted": "\u001b[0m}", - "FirstCause": false, - "LastCause": true - } - ] - } - } - } - ] - } - ] -} diff --git a/test/data/github-dep-snapshot/report.gsbom b/test/data/github-dep-snapshot/report.gsbom new file mode 100644 index 00000000..355b1eca --- /dev/null +++ b/test/data/github-dep-snapshot/report.gsbom @@ -0,0 +1,1238 @@ +{ + "version": 0, + "detector": { + "name": "trivy", + "version": "0.50.0", + "url": "https://github.com/aquasecurity/trivy" + }, + "metadata": { + "aquasecurity:trivy:RepoDigest": "knqyf263/vuln-image@sha256:1e8b199249d6d0ef3419ddc6eda2348d9fbdb10d350d3bb70aa98e87faa227c9", + "aquasecurity:trivy:RepoTag": "knqyf263/vuln-image:1.2.3" + }, + "job": { + "correlator": "_" + }, + "scanned": "2024-04-12T16:02:51+03:00", + "manifests": { + "knqyf263/vuln-image:1.2.3 (alpine 3.7.1)": { + "name": "alpine", + "resolved": { + ".composer-phpext-rundeps": { + "package_url": "pkg:apk/alpine/.composer-phpext-rundeps@0?arch=noarch\u0026distro=3.7.1", + "relationship": "direct", + "dependencies": [ + "libsodium@1.0.15-r0", + "musl@1.1.18-r3", + "zlib@1.2.11-r1" + ], + "scope": "runtime" + }, + ".persistent-deps": { + "package_url": "pkg:apk/alpine/.persistent-deps@0?arch=noarch\u0026distro=3.7.1", + "relationship": "direct", + "dependencies": [ + "ca-certificates@20171114-r0", + "curl@7.61.0-r0", + "libressl@2.6.5-r0", + "tar@1.29-r1", + "xz@5.2.3-r1" + ], + "scope": "runtime" + }, + ".php-rundeps": { + "package_url": "pkg:apk/alpine/.php-rundeps@0?arch=noarch\u0026distro=3.7.1", + "relationship": "direct", + "dependencies": [ + "libcurl@7.61.1-r0", + "libedit@20170329.3.1-r3", + "libressl2.6-libcrypto@2.6.5-r0", + "libressl2.6-libssl@2.6.5-r0", + "libsodium@1.0.15-r0", + "libxml2@2.9.7-r0", + "musl@1.1.18-r3", + "zlib@1.2.11-r1" + ], + "scope": "runtime" + }, + "alpine-baselayout": { + "package_url": "pkg:apk/alpine/alpine-baselayout@3.0.5-r2?arch=x86_64\u0026distro=3.7.1", + "relationship": "direct", + "dependencies": [ + "busybox@1.27.2-r11", + "musl@1.1.18-r3" + ], + "scope": "runtime" + }, + "alpine-keys": { + "package_url": "pkg:apk/alpine/alpine-keys@2.1-r1?arch=x86_64\u0026distro=3.7.1", + "relationship": "direct", + "scope": "runtime" + }, + "apk-tools": { + "package_url": "pkg:apk/alpine/apk-tools@2.10.1-r0?arch=x86_64\u0026distro=3.7.1", + "relationship": "direct", + "dependencies": [ + "libressl2.6-libcrypto@2.6.5-r0", + "libressl2.6-libssl@2.6.5-r0", + "musl@1.1.18-r3", + "zlib@1.2.11-r1" + ], + "scope": "runtime" + }, + "apr": { + "package_url": "pkg:apk/alpine/apr@1.6.3-r0?arch=x86_64\u0026distro=3.7.1", + "relationship": "direct", + "dependencies": [ + "libuuid@2.31-r0", + "musl@1.1.18-r3" + ], + "scope": "runtime" + }, + "apr-util": { + "package_url": "pkg:apk/alpine/apr-util@1.6.1-r1?arch=x86_64\u0026distro=3.7.1", + "relationship": "direct", + "dependencies": [ + "apr@1.6.3-r0", + "expat@2.2.5-r0", + "libressl2.6-libcrypto@2.6.5-r0", + "musl@1.1.18-r3" + ], + "scope": "runtime" + }, + "bash": { + "package_url": "pkg:apk/alpine/bash@4.4.19-r1?arch=x86_64\u0026distro=3.7.1", + "relationship": "direct", + "dependencies": [ + "busybox@1.27.2-r11", + "musl@1.1.18-r3", + "pkgconf@1.3.10-r0", + "readline@7.0.003-r0" + ], + "scope": "runtime" + }, + "busybox": { + "package_url": "pkg:apk/alpine/busybox@1.27.2-r11?arch=x86_64\u0026distro=3.7.1", + "relationship": "direct", + "dependencies": [ + "musl@1.1.18-r3" + ], + "scope": "runtime" + }, + "ca-certificates": { + "package_url": "pkg:apk/alpine/ca-certificates@20171114-r0?arch=x86_64\u0026distro=3.7.1", + "relationship": "direct", + "dependencies": [ + "busybox@1.27.2-r11", + "libressl2.6-libcrypto@2.6.5-r0", + "musl@1.1.18-r3" + ], + "scope": "runtime" + }, + "curl": { + "package_url": "pkg:apk/alpine/curl@7.61.0-r0?arch=x86_64\u0026distro=3.7.1", + "relationship": "direct", + "dependencies": [ + "ca-certificates@20171114-r0", + "libcurl@7.61.1-r0", + "musl@1.1.18-r3", + "zlib@1.2.11-r1" + ], + "scope": "runtime" + }, + "db": { + "package_url": "pkg:apk/alpine/db@5.3.28-r0?arch=x86_64\u0026distro=3.7.1", + "relationship": "direct", + "dependencies": [ + "musl@1.1.18-r3" + ], + "scope": "runtime" + }, + "expat": { + "package_url": "pkg:apk/alpine/expat@2.2.5-r0?arch=x86_64\u0026distro=3.7.1", + "relationship": "direct", + "dependencies": [ + "musl@1.1.18-r3" + ], + "scope": "runtime" + }, + "gdbm": { + "package_url": "pkg:apk/alpine/gdbm@1.13-r1?arch=x86_64\u0026distro=3.7.1", + "relationship": "direct", + "dependencies": [ + "musl@1.1.18-r3" + ], + "scope": "runtime" + }, + "git": { + "package_url": "pkg:apk/alpine/git@2.15.2-r0?arch=x86_64\u0026distro=3.7.1", + "relationship": "direct", + "dependencies": [ + "expat@2.2.5-r0", + "libcurl@7.61.1-r0", + "musl@1.1.18-r3", + "pcre2@10.30-r0", + "zlib@1.2.11-r1" + ], + "scope": "runtime" + }, + "libbz2": { + "package_url": "pkg:apk/alpine/libbz2@1.0.6-r6?arch=x86_64\u0026distro=3.7.1", + "relationship": "direct", + "dependencies": [ + "musl@1.1.18-r3" + ], + "scope": "runtime" + }, + "libc-utils": { + "package_url": "pkg:apk/alpine/libc-utils@0.7.1-r0?arch=x86_64\u0026distro=3.7.1", + "relationship": "direct", + "dependencies": [ + "musl-utils@1.1.18-r3" + ], + "scope": "runtime" + }, + "libcurl": { + "package_url": "pkg:apk/alpine/libcurl@7.61.1-r0?arch=x86_64\u0026distro=3.7.1", + "relationship": "direct", + "dependencies": [ + "ca-certificates@20171114-r0", + "libressl2.6-libcrypto@2.6.5-r0", + "libressl2.6-libssl@2.6.5-r0", + "libssh2@1.8.0-r2", + "musl@1.1.18-r3", + "zlib@1.2.11-r1" + ], + "scope": "runtime" + }, + "libedit": { + "package_url": "pkg:apk/alpine/libedit@20170329.3.1-r3?arch=x86_64\u0026distro=3.7.1", + "relationship": "direct", + "dependencies": [ + "musl@1.1.18-r3", + "ncurses-libs@6.0_p20171125-r1" + ], + "scope": "runtime" + }, + "libffi": { + "package_url": "pkg:apk/alpine/libffi@3.2.1-r4?arch=x86_64\u0026distro=3.7.1", + "relationship": "direct", + "dependencies": [ + "musl@1.1.18-r3" + ], + "scope": "runtime" + }, + "libressl": { + "package_url": "pkg:apk/alpine/libressl@2.6.5-r0?arch=x86_64\u0026distro=3.7.1", + "relationship": "direct", + "dependencies": [ + "libressl2.6-libcrypto@2.6.5-r0", + "libressl2.6-libssl@2.6.5-r0", + "libressl2.6-libtls@2.6.5-r0", + "musl@1.1.18-r3" + ], + "scope": "runtime" + }, + "libressl2.6-libcrypto": { + "package_url": "pkg:apk/alpine/libressl2.6-libcrypto@2.6.5-r0?arch=x86_64\u0026distro=3.7.1", + "relationship": "direct", + "dependencies": [ + "musl@1.1.18-r3" + ], + "scope": "runtime" + }, + "libressl2.6-libssl": { + "package_url": "pkg:apk/alpine/libressl2.6-libssl@2.6.5-r0?arch=x86_64\u0026distro=3.7.1", + "relationship": "direct", + "dependencies": [ + "libressl2.6-libcrypto@2.6.5-r0", + "musl@1.1.18-r3" + ], + "scope": "runtime" + }, + "libressl2.6-libtls": { + "package_url": "pkg:apk/alpine/libressl2.6-libtls@2.6.5-r0?arch=x86_64\u0026distro=3.7.1", + "relationship": "direct", + "dependencies": [ + "libressl2.6-libcrypto@2.6.5-r0", + "libressl2.6-libssl@2.6.5-r0", + "musl@1.1.18-r3" + ], + "scope": "runtime" + }, + "libsasl": { + "package_url": "pkg:apk/alpine/libsasl@2.1.26-r11?arch=x86_64\u0026distro=3.7.1", + "relationship": "direct", + "dependencies": [ + "db@5.3.28-r0", + "musl@1.1.18-r3" + ], + "scope": "runtime" + }, + "libsodium": { + "package_url": "pkg:apk/alpine/libsodium@1.0.15-r0?arch=x86_64\u0026distro=3.7.1", + "relationship": "direct", + "dependencies": [ + "musl@1.1.18-r3" + ], + "scope": "runtime" + }, + "libssh2": { + "package_url": "pkg:apk/alpine/libssh2@1.8.0-r2?arch=x86_64\u0026distro=3.7.1", + "relationship": "direct", + "dependencies": [ + "libressl2.6-libcrypto@2.6.5-r0", + "musl@1.1.18-r3", + "zlib@1.2.11-r1" + ], + "scope": "runtime" + }, + "libuuid": { + "package_url": "pkg:apk/alpine/libuuid@2.31-r0?arch=x86_64\u0026distro=3.7.1", + "relationship": "direct", + "dependencies": [ + "musl@1.1.18-r3" + ], + "scope": "runtime" + }, + "libxml2": { + "package_url": "pkg:apk/alpine/libxml2@2.9.7-r0?arch=x86_64\u0026distro=3.7.1", + "relationship": "direct", + "dependencies": [ + "musl@1.1.18-r3", + "zlib@1.2.11-r1" + ], + "scope": "runtime" + }, + "mercurial": { + "package_url": "pkg:apk/alpine/mercurial@4.5.2-r0?arch=x86_64\u0026distro=3.7.1", + "relationship": "direct", + "dependencies": [ + "musl@1.1.18-r3", + "python2@2.7.15-r2" + ], + "scope": "runtime" + }, + "musl": { + "package_url": "pkg:apk/alpine/musl@1.1.18-r3?arch=x86_64\u0026distro=3.7.1", + "relationship": "direct", + "scope": "runtime" + }, + "musl-utils": { + "package_url": "pkg:apk/alpine/musl-utils@1.1.18-r3?arch=x86_64\u0026distro=3.7.1", + "relationship": "direct", + "dependencies": [ + "musl@1.1.18-r3", + "scanelf@1.2.2-r1" + ], + "scope": "runtime" + }, + "ncurses-libs": { + "package_url": "pkg:apk/alpine/ncurses-libs@6.0_p20171125-r1?arch=x86_64\u0026distro=3.7.1", + "relationship": "direct", + "dependencies": [ + "musl@1.1.18-r3", + "ncurses-terminfo-base@6.0_p20171125-r1", + "ncurses-terminfo@6.0_p20171125-r1" + ], + "scope": "runtime" + }, + "ncurses-terminfo": { + "package_url": "pkg:apk/alpine/ncurses-terminfo@6.0_p20171125-r1?arch=x86_64\u0026distro=3.7.1", + "relationship": "direct", + "dependencies": [ + "ncurses-terminfo-base@6.0_p20171125-r1" + ], + "scope": "runtime" + }, + "ncurses-terminfo-base": { + "package_url": "pkg:apk/alpine/ncurses-terminfo-base@6.0_p20171125-r1?arch=x86_64\u0026distro=3.7.1", + "relationship": "direct", + "scope": "runtime" + }, + "openssh": { + "package_url": "pkg:apk/alpine/openssh@7.5_p1-r9?arch=x86_64\u0026distro=3.7.1", + "relationship": "direct", + "dependencies": [ + "libressl2.6-libcrypto@2.6.5-r0", + "musl@1.1.18-r3", + "openssh-client@7.5_p1-r9", + "openssh-server@7.5_p1-r9", + "openssh-sftp-server@7.5_p1-r9" + ], + "scope": "runtime" + }, + "openssh-client": { + "package_url": "pkg:apk/alpine/openssh-client@7.5_p1-r9?arch=x86_64\u0026distro=3.7.1", + "relationship": "direct", + "dependencies": [ + "libressl2.6-libcrypto@2.6.5-r0", + "musl@1.1.18-r3", + "openssh-keygen@7.5_p1-r9", + "zlib@1.2.11-r1" + ], + "scope": "runtime" + }, + "openssh-keygen": { + "package_url": "pkg:apk/alpine/openssh-keygen@7.5_p1-r9?arch=x86_64\u0026distro=3.7.1", + "relationship": "direct", + "dependencies": [ + "libressl2.6-libcrypto@2.6.5-r0", + "musl@1.1.18-r3" + ], + "scope": "runtime" + }, + "openssh-server": { + "package_url": "pkg:apk/alpine/openssh-server@7.5_p1-r9?arch=x86_64\u0026distro=3.7.1", + "relationship": "direct", + "dependencies": [ + "libressl2.6-libcrypto@2.6.5-r0", + "musl@1.1.18-r3", + "openssh-keygen@7.5_p1-r9", + "openssh-server-common@7.5_p1-r9", + "zlib@1.2.11-r1" + ], + "scope": "runtime" + }, + "openssh-server-common": { + "package_url": "pkg:apk/alpine/openssh-server-common@7.5_p1-r9?arch=x86_64\u0026distro=3.7.1", + "relationship": "direct", + "scope": "runtime" + }, + "openssh-sftp-server": { + "package_url": "pkg:apk/alpine/openssh-sftp-server@7.5_p1-r9?arch=x86_64\u0026distro=3.7.1", + "relationship": "direct", + "dependencies": [ + "musl@1.1.18-r3" + ], + "scope": "runtime" + }, + "patch": { + "package_url": "pkg:apk/alpine/patch@2.7.5-r2?arch=x86_64\u0026distro=3.7.1", + "relationship": "direct", + "dependencies": [ + "musl@1.1.18-r3" + ], + "scope": "runtime" + }, + "pcre2": { + "package_url": "pkg:apk/alpine/pcre2@10.30-r0?arch=x86_64\u0026distro=3.7.1", + "relationship": "direct", + "dependencies": [ + "musl@1.1.18-r3" + ], + "scope": "runtime" + }, + "pkgconf": { + "package_url": "pkg:apk/alpine/pkgconf@1.3.10-r0?arch=x86_64\u0026distro=3.7.1", + "relationship": "direct", + "dependencies": [ + "musl@1.1.18-r3" + ], + "scope": "runtime" + }, + "python2": { + "package_url": "pkg:apk/alpine/python2@2.7.15-r2?arch=x86_64\u0026distro=3.7.1", + "relationship": "direct", + "dependencies": [ + "expat@2.2.5-r0", + "gdbm@1.13-r1", + "libbz2@1.0.6-r6", + "libffi@3.2.1-r4", + "libressl2.6-libcrypto@2.6.5-r0", + "libressl2.6-libssl@2.6.5-r0", + "musl@1.1.18-r3", + "ncurses-libs@6.0_p20171125-r1", + "readline@7.0.003-r0", + "sqlite-libs@3.21.0-r1", + "zlib@1.2.11-r1" + ], + "scope": "runtime" + }, + "readline": { + "package_url": "pkg:apk/alpine/readline@7.0.003-r0?arch=x86_64\u0026distro=3.7.1", + "relationship": "direct", + "dependencies": [ + "musl@1.1.18-r3", + "ncurses-libs@6.0_p20171125-r1" + ], + "scope": "runtime" + }, + "scanelf": { + "package_url": "pkg:apk/alpine/scanelf@1.2.2-r1?arch=x86_64\u0026distro=3.7.1", + "relationship": "direct", + "dependencies": [ + "musl@1.1.18-r3" + ], + "scope": "runtime" + }, + "serf": { + "package_url": "pkg:apk/alpine/serf@1.3.9-r3?arch=x86_64\u0026distro=3.7.1", + "relationship": "direct", + "dependencies": [ + "apr-util@1.6.1-r1", + "apr@1.6.3-r0", + "libressl2.6-libcrypto@2.6.5-r0", + "libressl2.6-libssl@2.6.5-r0", + "musl@1.1.18-r3", + "zlib@1.2.11-r1" + ], + "scope": "runtime" + }, + "sqlite-libs": { + "package_url": "pkg:apk/alpine/sqlite-libs@3.21.0-r1?arch=x86_64\u0026distro=3.7.1", + "relationship": "direct", + "dependencies": [ + "musl@1.1.18-r3" + ], + "scope": "runtime" + }, + "ssl_client": { + "package_url": "pkg:apk/alpine/ssl_client@1.27.2-r11?arch=x86_64\u0026distro=3.7.1", + "relationship": "direct", + "dependencies": [ + "libressl2.6-libtls@2.6.5-r0", + "musl@1.1.18-r3" + ], + "scope": "runtime" + }, + "subversion": { + "package_url": "pkg:apk/alpine/subversion@1.9.7-r0?arch=x86_64\u0026distro=3.7.1", + "relationship": "direct", + "dependencies": [ + "apr-util@1.6.1-r1", + "apr@1.6.3-r0", + "busybox@1.27.2-r11", + "libsasl@2.1.26-r11", + "musl@1.1.18-r3", + "subversion-libs@1.9.7-r0" + ], + "scope": "runtime" + }, + "subversion-libs": { + "package_url": "pkg:apk/alpine/subversion-libs@1.9.7-r0?arch=x86_64\u0026distro=3.7.1", + "relationship": "direct", + "dependencies": [ + "apr-util@1.6.1-r1", + "apr@1.6.3-r0", + "db@5.3.28-r0", + "expat@2.2.5-r0", + "libsasl@2.1.26-r11", + "musl@1.1.18-r3", + "serf@1.3.9-r3", + "sqlite-libs@3.21.0-r1", + "zlib@1.2.11-r1" + ], + "scope": "runtime" + }, + "tar": { + "package_url": "pkg:apk/alpine/tar@1.29-r1?arch=x86_64\u0026distro=3.7.1", + "relationship": "direct", + "dependencies": [ + "musl@1.1.18-r3" + ], + "scope": "runtime" + }, + "tini": { + "package_url": "pkg:apk/alpine/tini@0.16.1-r0?arch=x86_64\u0026distro=3.7.1", + "relationship": "direct", + "dependencies": [ + "musl@1.1.18-r3" + ], + "scope": "runtime" + }, + "xz": { + "package_url": "pkg:apk/alpine/xz@5.2.3-r1?arch=x86_64\u0026distro=3.7.1", + "relationship": "direct", + "dependencies": [ + "musl@1.1.18-r3", + "xz-libs@5.2.3-r1" + ], + "scope": "runtime" + }, + "xz-libs": { + "package_url": "pkg:apk/alpine/xz-libs@5.2.3-r1?arch=x86_64\u0026distro=3.7.1", + "relationship": "direct", + "dependencies": [ + "musl@1.1.18-r3" + ], + "scope": "runtime" + }, + "zlib": { + "package_url": "pkg:apk/alpine/zlib@1.2.11-r1?arch=x86_64\u0026distro=3.7.1", + "relationship": "direct", + "dependencies": [ + "musl@1.1.18-r3" + ], + "scope": "runtime" + } + } + }, + "php-app/composer.lock": { + "name": "composer", + "file": { + "source_location": "knqyf263/vuln-image:1.2.3@sha256:1e8b199249d6d0ef3419ddc6eda2348d9fbdb10d350d3bb70aa98e87faa227c9" + }, + "resolved": { + "guzzlehttp/guzzle": { + "package_url": "pkg:composer/guzzlehttp/guzzle@6.2.0", + "relationship": "direct", + "dependencies": [ + "guzzlehttp/promises@v1.3.1", + "guzzlehttp/psr7@1.5.2" + ], + "scope": "runtime" + }, + "guzzlehttp/promises": { + "package_url": "pkg:composer/guzzlehttp/promises@v1.3.1", + "relationship": "direct", + "scope": "runtime" + }, + "guzzlehttp/psr7": { + "package_url": "pkg:composer/guzzlehttp/psr7@1.5.2", + "relationship": "direct", + "dependencies": [ + "psr/http-message@1.0.1", + "ralouphie/getallheaders@2.0.5" + ], + "scope": "runtime" + }, + "laravel/installer": { + "package_url": "pkg:composer/laravel/installer@v2.0.1", + "relationship": "direct", + "dependencies": [ + "guzzlehttp/guzzle@6.2.0", + "symfony/console@v4.2.7", + "symfony/filesystem@v4.2.7", + "symfony/process@v4.2.7" + ], + "scope": "runtime" + }, + "pear/log": { + "package_url": "pkg:composer/pear/log@1.13.1", + "relationship": "direct", + "dependencies": [ + "pear/pear_exception@v1.0.0" + ], + "scope": "runtime" + }, + "pear/pear_exception": { + "package_url": "pkg:composer/pear/pear_exception@v1.0.0", + "relationship": "direct", + "scope": "runtime" + }, + "psr/http-message": { + "package_url": "pkg:composer/psr/http-message@1.0.1", + "relationship": "direct", + "scope": "runtime" + }, + "ralouphie/getallheaders": { + "package_url": "pkg:composer/ralouphie/getallheaders@2.0.5", + "relationship": "direct", + "scope": "runtime" + }, + "symfony/console": { + "package_url": "pkg:composer/symfony/console@v4.2.7", + "relationship": "direct", + "dependencies": [ + "symfony/contracts@v1.0.2", + "symfony/polyfill-mbstring@v1.11.0" + ], + "scope": "runtime" + }, + "symfony/contracts": { + "package_url": "pkg:composer/symfony/contracts@v1.0.2", + "relationship": "direct", + "scope": "runtime" + }, + "symfony/filesystem": { + "package_url": "pkg:composer/symfony/filesystem@v4.2.7", + "relationship": "direct", + "dependencies": [ + "symfony/polyfill-ctype@v1.11.0" + ], + "scope": "runtime" + }, + "symfony/polyfill-ctype": { + "package_url": "pkg:composer/symfony/polyfill-ctype@v1.11.0", + "relationship": "direct", + "scope": "runtime" + }, + "symfony/polyfill-mbstring": { + "package_url": "pkg:composer/symfony/polyfill-mbstring@v1.11.0", + "relationship": "direct", + "scope": "runtime" + }, + "symfony/process": { + "package_url": "pkg:composer/symfony/process@v4.2.7", + "relationship": "direct", + "scope": "runtime" + } + } + }, + "rust-app/Cargo.lock": { + "name": "cargo", + "file": { + "source_location": "knqyf263/vuln-image:1.2.3@sha256:1e8b199249d6d0ef3419ddc6eda2348d9fbdb10d350d3bb70aa98e87faa227c9" + }, + "resolved": { + "ammonia": { + "package_url": "pkg:cargo/ammonia@1.9.0", + "relationship": "direct", + "dependencies": [ + "html5ever@0.23.0", + "lazy_static@1.3.0", + "maplit@1.0.1", + "matches@0.1.8", + "tendril@0.4.1", + "url@1.7.2" + ], + "scope": "runtime" + }, + "autocfg": { + "package_url": "pkg:cargo/autocfg@0.1.2", + "relationship": "direct", + "scope": "runtime" + }, + "bitflags": { + "package_url": "pkg:cargo/bitflags@1.0.4", + "relationship": "direct", + "scope": "runtime" + }, + "cfg-if": { + "package_url": "pkg:cargo/cfg-if@0.1.7", + "relationship": "direct", + "scope": "runtime" + }, + "cloudabi": { + "package_url": "pkg:cargo/cloudabi@0.0.3", + "relationship": "direct", + "dependencies": [ + "bitflags@1.0.4" + ], + "scope": "runtime" + }, + "fuchsia-cprng": { + "package_url": "pkg:cargo/fuchsia-cprng@0.1.1", + "relationship": "direct", + "scope": "runtime" + }, + "futf": { + "package_url": "pkg:cargo/futf@0.1.4", + "relationship": "direct", + "dependencies": [ + "mac@0.1.1", + "new_debug_unreachable@1.0.3" + ], + "scope": "runtime" + }, + "gdi32-sys": { + "package_url": "pkg:cargo/gdi32-sys@0.2.0", + "relationship": "direct", + "dependencies": [ + "winapi-build@0.1.1", + "winapi@0.2.8" + ], + "scope": "runtime" + }, + "html5ever": { + "package_url": "pkg:cargo/html5ever@0.23.0", + "relationship": "direct", + "dependencies": [ + "log@0.4.6", + "mac@0.1.1", + "markup5ever@0.8.1", + "proc-macro2@0.4.30", + "quote@0.6.12", + "syn@0.15.34" + ], + "scope": "runtime" + }, + "idna": { + "package_url": "pkg:cargo/idna@0.1.5", + "relationship": "direct", + "dependencies": [ + "matches@0.1.8", + "unicode-bidi@0.3.4", + "unicode-normalization@0.1.8" + ], + "scope": "runtime" + }, + "itoa": { + "package_url": "pkg:cargo/itoa@0.4.4", + "relationship": "direct", + "scope": "runtime" + }, + "kernel32-sys": { + "package_url": "pkg:cargo/kernel32-sys@0.2.2", + "relationship": "direct", + "dependencies": [ + "winapi-build@0.1.1", + "winapi@0.2.8" + ], + "scope": "runtime" + }, + "lazy_static": { + "package_url": "pkg:cargo/lazy_static@1.3.0", + "relationship": "direct", + "scope": "runtime" + }, + "libc": { + "package_url": "pkg:cargo/libc@0.2.54", + "relationship": "direct", + "scope": "runtime" + }, + "libressl-pnacl-sys": { + "package_url": "pkg:cargo/libressl-pnacl-sys@2.1.6", + "relationship": "direct", + "dependencies": [ + "pnacl-build-helper@1.4.11" + ], + "scope": "runtime" + }, + "log": { + "package_url": "pkg:cargo/log@0.4.6", + "relationship": "direct", + "dependencies": [ + "cfg-if@0.1.7" + ], + "scope": "runtime" + }, + "mac": { + "package_url": "pkg:cargo/mac@0.1.1", + "relationship": "direct", + "scope": "runtime" + }, + "maplit": { + "package_url": "pkg:cargo/maplit@1.0.1", + "relationship": "direct", + "scope": "runtime" + }, + "markup5ever": { + "package_url": "pkg:cargo/markup5ever@0.8.1", + "relationship": "direct", + "dependencies": [ + "log@0.4.6", + "phf@0.7.24", + "phf_codegen@0.7.24", + "serde@1.0.91", + "serde_derive@1.0.91", + "serde_json@1.0.39", + "string_cache@0.7.3", + "string_cache_codegen@0.4.2", + "tendril@0.4.1" + ], + "scope": "runtime" + }, + "matches": { + "package_url": "pkg:cargo/matches@0.1.8", + "relationship": "direct", + "scope": "runtime" + }, + "new_debug_unreachable": { + "package_url": "pkg:cargo/new_debug_unreachable@1.0.3", + "relationship": "direct", + "scope": "runtime" + }, + "normal": { + "package_url": "pkg:cargo/normal@0.1.0", + "relationship": "direct", + "dependencies": [ + "ammonia@2.0.0", + "libc@0.2.54", + "openssl@0.8.3" + ], + "scope": "runtime" + }, + "openssl": { + "package_url": "pkg:cargo/openssl@0.8.3", + "relationship": "direct", + "dependencies": [ + "bitflags@0.7.0", + "lazy_static@0.2.11", + "libc@0.2.54", + "openssl-sys@0.7.17" + ], + "scope": "runtime" + }, + "openssl-sys": { + "package_url": "pkg:cargo/openssl-sys@0.7.17", + "relationship": "direct", + "dependencies": [ + "gdi32-sys@0.2.0", + "libc@0.2.54", + "libressl-pnacl-sys@2.1.6", + "pkg-config@0.3.14", + "user32-sys@0.2.0" + ], + "scope": "runtime" + }, + "percent-encoding": { + "package_url": "pkg:cargo/percent-encoding@1.0.1", + "relationship": "direct", + "scope": "runtime" + }, + "phf": { + "package_url": "pkg:cargo/phf@0.7.24", + "relationship": "direct", + "dependencies": [ + "phf_shared@0.7.24" + ], + "scope": "runtime" + }, + "phf_codegen": { + "package_url": "pkg:cargo/phf_codegen@0.7.24", + "relationship": "direct", + "dependencies": [ + "phf_generator@0.7.24", + "phf_shared@0.7.24" + ], + "scope": "runtime" + }, + "phf_generator": { + "package_url": "pkg:cargo/phf_generator@0.7.24", + "relationship": "direct", + "dependencies": [ + "phf_shared@0.7.24", + "rand@0.6.5" + ], + "scope": "runtime" + }, + "phf_shared": { + "package_url": "pkg:cargo/phf_shared@0.7.24", + "relationship": "direct", + "dependencies": [ + "siphasher@0.2.3" + ], + "scope": "runtime" + }, + "pkg-config": { + "package_url": "pkg:cargo/pkg-config@0.3.14", + "relationship": "direct", + "scope": "runtime" + }, + "pnacl-build-helper": { + "package_url": "pkg:cargo/pnacl-build-helper@1.4.11", + "relationship": "direct", + "dependencies": [ + "tempdir@0.3.7", + "walkdir@1.0.7" + ], + "scope": "runtime" + }, + "precomputed-hash": { + "package_url": "pkg:cargo/precomputed-hash@0.1.1", + "relationship": "direct", + "scope": "runtime" + }, + "proc-macro2": { + "package_url": "pkg:cargo/proc-macro2@0.4.30", + "relationship": "direct", + "dependencies": [ + "unicode-xid@0.1.0" + ], + "scope": "runtime" + }, + "quote": { + "package_url": "pkg:cargo/quote@0.6.12", + "relationship": "direct", + "dependencies": [ + "proc-macro2@0.4.30" + ], + "scope": "runtime" + }, + "rand": { + "package_url": "pkg:cargo/rand@0.6.5", + "relationship": "direct", + "dependencies": [ + "autocfg@0.1.2", + "libc@0.2.54", + "rand_chacha@0.1.1", + "rand_core@0.4.0", + "rand_hc@0.1.0", + "rand_isaac@0.1.1", + "rand_jitter@0.1.4", + "rand_os@0.1.3", + "rand_pcg@0.1.2", + "rand_xorshift@0.1.1", + "winapi@0.3.7" + ], + "scope": "runtime" + }, + "rand_chacha": { + "package_url": "pkg:cargo/rand_chacha@0.1.1", + "relationship": "direct", + "dependencies": [ + "autocfg@0.1.2", + "rand_core@0.3.1" + ], + "scope": "runtime" + }, + "rand_core": { + "package_url": "pkg:cargo/rand_core@0.4.0", + "relationship": "direct", + "scope": "runtime" + }, + "rand_hc": { + "package_url": "pkg:cargo/rand_hc@0.1.0", + "relationship": "direct", + "dependencies": [ + "rand_core@0.3.1" + ], + "scope": "runtime" + }, + "rand_isaac": { + "package_url": "pkg:cargo/rand_isaac@0.1.1", + "relationship": "direct", + "dependencies": [ + "rand_core@0.3.1" + ], + "scope": "runtime" + }, + "rand_jitter": { + "package_url": "pkg:cargo/rand_jitter@0.1.4", + "relationship": "direct", + "dependencies": [ + "libc@0.2.54", + "rand_core@0.4.0", + "winapi@0.3.7" + ], + "scope": "runtime" + }, + "rand_os": { + "package_url": "pkg:cargo/rand_os@0.1.3", + "relationship": "direct", + "dependencies": [ + "cloudabi@0.0.3", + "fuchsia-cprng@0.1.1", + "libc@0.2.54", + "rand_core@0.4.0", + "rdrand@0.4.0", + "winapi@0.3.7" + ], + "scope": "runtime" + }, + "rand_pcg": { + "package_url": "pkg:cargo/rand_pcg@0.1.2", + "relationship": "direct", + "dependencies": [ + "autocfg@0.1.2", + "rand_core@0.4.0" + ], + "scope": "runtime" + }, + "rand_xorshift": { + "package_url": "pkg:cargo/rand_xorshift@0.1.1", + "relationship": "direct", + "dependencies": [ + "rand_core@0.3.1" + ], + "scope": "runtime" + }, + "rdrand": { + "package_url": "pkg:cargo/rdrand@0.4.0", + "relationship": "direct", + "dependencies": [ + "rand_core@0.3.1" + ], + "scope": "runtime" + }, + "remove_dir_all": { + "package_url": "pkg:cargo/remove_dir_all@0.5.1", + "relationship": "direct", + "dependencies": [ + "winapi@0.3.7" + ], + "scope": "runtime" + }, + "ryu": { + "package_url": "pkg:cargo/ryu@0.2.8", + "relationship": "direct", + "scope": "runtime" + }, + "same-file": { + "package_url": "pkg:cargo/same-file@0.1.3", + "relationship": "direct", + "dependencies": [ + "kernel32-sys@0.2.2", + "winapi@0.2.8" + ], + "scope": "runtime" + }, + "serde": { + "package_url": "pkg:cargo/serde@1.0.91", + "relationship": "direct", + "scope": "runtime" + }, + "serde_derive": { + "package_url": "pkg:cargo/serde_derive@1.0.91", + "relationship": "direct", + "dependencies": [ + "proc-macro2@0.4.30", + "quote@0.6.12", + "syn@0.15.34" + ], + "scope": "runtime" + }, + "serde_json": { + "package_url": "pkg:cargo/serde_json@1.0.39", + "relationship": "direct", + "dependencies": [ + "itoa@0.4.4", + "ryu@0.2.8", + "serde@1.0.91" + ], + "scope": "runtime" + }, + "siphasher": { + "package_url": "pkg:cargo/siphasher@0.2.3", + "relationship": "direct", + "scope": "runtime" + }, + "smallvec": { + "package_url": "pkg:cargo/smallvec@0.6.9", + "relationship": "direct", + "scope": "runtime" + }, + "string_cache": { + "package_url": "pkg:cargo/string_cache@0.7.3", + "relationship": "direct", + "dependencies": [ + "lazy_static@1.3.0", + "new_debug_unreachable@1.0.3", + "phf_shared@0.7.24", + "precomputed-hash@0.1.1", + "serde@1.0.91", + "string_cache_codegen@0.4.2", + "string_cache_shared@0.3.0" + ], + "scope": "runtime" + }, + "string_cache_codegen": { + "package_url": "pkg:cargo/string_cache_codegen@0.4.2", + "relationship": "direct", + "dependencies": [ + "phf_generator@0.7.24", + "phf_shared@0.7.24", + "proc-macro2@0.4.30", + "quote@0.6.12", + "string_cache_shared@0.3.0" + ], + "scope": "runtime" + }, + "string_cache_shared": { + "package_url": "pkg:cargo/string_cache_shared@0.3.0", + "relationship": "direct", + "scope": "runtime" + }, + "syn": { + "package_url": "pkg:cargo/syn@0.15.34", + "relationship": "direct", + "dependencies": [ + "proc-macro2@0.4.30", + "quote@0.6.12", + "unicode-xid@0.1.0" + ], + "scope": "runtime" + }, + "tempdir": { + "package_url": "pkg:cargo/tempdir@0.3.7", + "relationship": "direct", + "dependencies": [ + "rand@0.4.6", + "remove_dir_all@0.5.1" + ], + "scope": "runtime" + }, + "tendril": { + "package_url": "pkg:cargo/tendril@0.4.1", + "relationship": "direct", + "dependencies": [ + "futf@0.1.4", + "mac@0.1.1", + "utf-8@0.7.5" + ], + "scope": "runtime" + }, + "unicode-bidi": { + "package_url": "pkg:cargo/unicode-bidi@0.3.4", + "relationship": "direct", + "dependencies": [ + "matches@0.1.8" + ], + "scope": "runtime" + }, + "unicode-normalization": { + "package_url": "pkg:cargo/unicode-normalization@0.1.8", + "relationship": "direct", + "dependencies": [ + "smallvec@0.6.9" + ], + "scope": "runtime" + }, + "unicode-xid": { + "package_url": "pkg:cargo/unicode-xid@0.1.0", + "relationship": "direct", + "scope": "runtime" + }, + "url": { + "package_url": "pkg:cargo/url@1.7.2", + "relationship": "direct", + "dependencies": [ + "idna@0.1.5", + "matches@0.1.8", + "percent-encoding@1.0.1" + ], + "scope": "runtime" + }, + "user32-sys": { + "package_url": "pkg:cargo/user32-sys@0.2.0", + "relationship": "direct", + "dependencies": [ + "winapi-build@0.1.1", + "winapi@0.2.8" + ], + "scope": "runtime" + }, + "utf-8": { + "package_url": "pkg:cargo/utf-8@0.7.5", + "relationship": "direct", + "scope": "runtime" + }, + "walkdir": { + "package_url": "pkg:cargo/walkdir@1.0.7", + "relationship": "direct", + "dependencies": [ + "kernel32-sys@0.2.2", + "same-file@0.1.3", + "winapi@0.2.8" + ], + "scope": "runtime" + }, + "winapi": { + "package_url": "pkg:cargo/winapi@0.3.7", + "relationship": "direct", + "dependencies": [ + "winapi-i686-pc-windows-gnu@0.4.0", + "winapi-x86_64-pc-windows-gnu@0.4.0" + ], + "scope": "runtime" + }, + "winapi-build": { + "package_url": "pkg:cargo/winapi-build@0.1.1", + "relationship": "direct", + "scope": "runtime" + }, + "winapi-i686-pc-windows-gnu": { + "package_url": "pkg:cargo/winapi-i686-pc-windows-gnu@0.4.0", + "relationship": "direct", + "scope": "runtime" + }, + "winapi-x86_64-pc-windows-gnu": { + "package_url": "pkg:cargo/winapi-x86_64-pc-windows-gnu@0.4.0", + "relationship": "direct", + "scope": "runtime" + } + } + } + } +} \ No newline at end of file diff --git a/test/data/image-sarif.test b/test/data/image-sarif.test deleted file mode 100644 index c6295c9d..00000000 --- a/test/data/image-sarif.test +++ /dev/null @@ -1,77 +0,0 @@ -{ - "version": "2.1.0", - "$schema": "https://json.schemastore.org/sarif-2.1.0.json", - "runs": [ - { - "tool": { - "driver": { - "fullName": "Trivy Vulnerability Scanner", - "informationUri": "https://github.com/aquasecurity/trivy", - "name": "Trivy", - "rules": [ - { - "id": "CVE-2021-36159", - "name": "OsPackageVulnerability", - "shortDescription": { - "text": "CVE-2021-36159" - }, - "fullDescription": { - "text": "libfetch before 2021-07-26, as used in apk-tools, xbps, and other products, mishandles numeric strings for the FTP and HTTP protocols. The FTP passive mode implementation allows an out-of-bounds read because strtol is used to parse the relevant numbers into address bytes. It does not check if the line ends prematurely. If it does, the for-loop condition checks for the \u0026#39;\\0\u0026#39; terminator one byte too late." - }, - "defaultConfiguration": { - "level": "error" - }, - "helpUri": "https://avd.aquasec.com/nvd/cve-2021-36159", - "help": { - "text": "Vulnerability CVE-2021-36159\nSeverity: CRITICAL\nPackage: apk-tools\nFixed Version: 2.10.7-r0\nLink: [CVE-2021-36159](https://avd.aquasec.com/nvd/cve-2021-36159)\nlibfetch before 2021-07-26, as used in apk-tools, xbps, and other products, mishandles numeric strings for the FTP and HTTP protocols. The FTP passive mode implementation allows an out-of-bounds read because strtol is used to parse the relevant numbers into address bytes. It does not check if the line ends prematurely. If it does, the for-loop condition checks for the '\\0' terminator one byte too late.", - "markdown": "**Vulnerability CVE-2021-36159**\n| Severity | Package | Fixed Version | Link |\n| --- | --- | --- | --- |\n|CRITICAL|apk-tools|2.10.7-r0|[CVE-2021-36159](https://avd.aquasec.com/nvd/cve-2021-36159)|\n\nlibfetch before 2021-07-26, as used in apk-tools, xbps, and other products, mishandles numeric strings for the FTP and HTTP protocols. The FTP passive mode implementation allows an out-of-bounds read because strtol is used to parse the relevant numbers into address bytes. It does not check if the line ends prematurely. If it does, the for-loop condition checks for the '\\0' terminator one byte too late." - }, - "properties": { - "precision": "very-high", - "security-severity": "9.1", - "tags": [ - "vulnerability", - "security", - "CRITICAL" - ] - } - } - ], - "version": "0.43.1" - } - }, - "results": [ - { - "ruleId": "CVE-2021-36159", - "ruleIndex": 0, - "level": "error", - "message": { - "text": "Package: apk-tools\nInstalled Version: 2.10.6-r0\nVulnerability CVE-2021-36159\nSeverity: CRITICAL\nFixed Version: 2.10.7-r0\nLink: [CVE-2021-36159](https://avd.aquasec.com/nvd/cve-2021-36159)" - }, - "locations": [ - { - "physicalLocation": { - "artifactLocation": { - "uri": "library/alpine", - "uriBaseId": "ROOTPATH" - }, - "region": { - "startLine": 1, - "startColumn": 1, - "endLine": 1, - "endColumn": 1 - } - } - } - ] - } - ], - "columnKind": "utf16CodeUnits", - "originalUriBaseIds": { - "ROOTPATH": { - "uri": "file:///" - } - } - } - ] -} diff --git a/test/data/image.test b/test/data/image-scan/report similarity index 99% rename from test/data/image.test rename to test/data/image-scan/report index d954ed1b..6e930cd7 100644 --- a/test/data/image.test +++ b/test/data/image-scan/report @@ -30,7 +30,7 @@ Total: 19 (CRITICAL: 19) │ │ CVE-2019-5482 │ │ │ │ │ heap buffer overflow in function tftp_receive_packet() │ │ │ │ │ │ │ │ https://avd.aquasec.com/nvd/cve-2019-5482 │ ├─────────────┼────────────────┤ │ ├───────────────────┼───────────────┼──────────────────────────────────────────────────────────────┤ -│ git │ CVE-2018-17456 │ │ │ 2.15.2-r0 │ 2.15.3-r0 │ arbitrary code execution via .gitmodules │ +│ git │ CVE-2018-17456 │ │ │ 2.15.2-r0 │ 2.15.3-r0 │ git: arbitrary code execution via .gitmodules │ │ │ │ │ │ │ │ https://avd.aquasec.com/nvd/cve-2018-17456 │ │ ├────────────────┤ │ │ ├───────────────┼──────────────────────────────────────────────────────────────┤ │ │ CVE-2019-1353 │ │ │ │ 2.15.4-r0 │ git: NTFS protections inactive when running Git in the │ diff --git a/test/data/rootfs.test b/test/data/rootfs-scan/report similarity index 100% rename from test/data/rootfs.test rename to test/data/rootfs-scan/report diff --git a/test/data/repo.test b/test/data/secret-scan/report.json similarity index 100% rename from test/data/repo.test rename to test/data/secret-scan/report.json diff --git a/test/data/.trivyignore1 b/test/data/with-ignore-files/.trivyignore1 similarity index 100% rename from test/data/.trivyignore1 rename to test/data/with-ignore-files/.trivyignore1 diff --git a/test/data/.trivyignore2 b/test/data/with-ignore-files/.trivyignore2 similarity index 100% rename from test/data/.trivyignore2 rename to test/data/with-ignore-files/.trivyignore2 diff --git a/test/data/image-trivyignores.test b/test/data/with-ignore-files/report similarity index 99% rename from test/data/image-trivyignores.test rename to test/data/with-ignore-files/report index aa3d4aee..8b262553 100644 --- a/test/data/image-trivyignores.test +++ b/test/data/with-ignore-files/report @@ -30,7 +30,7 @@ Total: 19 (CRITICAL: 19) │ │ CVE-2019-5482 │ │ │ │ │ heap buffer overflow in function tftp_receive_packet() │ │ │ │ │ │ │ │ https://avd.aquasec.com/nvd/cve-2019-5482 │ ├─────────────┼────────────────┤ │ ├───────────────────┼───────────────┼──────────────────────────────────────────────────────────────┤ -│ git │ CVE-2018-17456 │ │ │ 2.15.2-r0 │ 2.15.3-r0 │ arbitrary code execution via .gitmodules │ +│ git │ CVE-2018-17456 │ │ │ 2.15.2-r0 │ 2.15.3-r0 │ git: arbitrary code execution via .gitmodules │ │ │ │ │ │ │ │ https://avd.aquasec.com/nvd/cve-2018-17456 │ │ ├────────────────┤ │ │ ├───────────────┼──────────────────────────────────────────────────────────────┤ │ │ CVE-2019-1353 │ │ │ │ 2.15.4-r0 │ git: NTFS protections inactive when running Git in the │ diff --git a/test/data/dev.tfvars b/test/data/with-tf-vars/dev.tfvars similarity index 100% rename from test/data/dev.tfvars rename to test/data/with-tf-vars/dev.tfvars diff --git a/test/data/with-tf-vars/main.tf b/test/data/with-tf-vars/main.tf new file mode 100644 index 00000000..85208bb2 --- /dev/null +++ b/test/data/with-tf-vars/main.tf @@ -0,0 +1,18 @@ +# test data for trivy config with terraform variables + +variable "bucket_versioning_enabled" { + type = string + default = "Disabled" +} + +resource "aws_s3_bucket" "bucket" { + bucket = "trivy-action-bucket" +} + +resource "aws_s3_bucket_versioning" "bucket_versioning" { + bucket = aws_s3_bucket.bucket.id + + versioning_configuration { + status = var.bucket_versioning_enabled + } +} \ No newline at end of file diff --git a/test/data/tfvars.test b/test/data/with-tf-vars/report.json similarity index 86% rename from test/data/tfvars.test rename to test/data/with-tf-vars/report.json index c2d09b88..562b065f 100644 --- a/test/data/tfvars.test +++ b/test/data/with-tf-vars/report.json @@ -1,7 +1,7 @@ { "SchemaVersion": 2, - "CreatedAt": "2024-01-02T16:27:32.841193-07:00", - "ArtifactName": "test/data", + "CreatedAt": "2024-04-12T14:09:09.5680191+03:00", + "ArtifactName": "test/data/with-tf-vars/main.tf", "ArtifactType": "filesystem", "Metadata": { "ImageConfig": { diff --git a/test/data/yamlconfig.test b/test/data/with-trivy-yaml-cfg/report.json similarity index 95% rename from test/data/yamlconfig.test rename to test/data/with-trivy-yaml-cfg/report.json index 0edc4774..b5e94ad5 100644 --- a/test/data/yamlconfig.test +++ b/test/data/with-trivy-yaml-cfg/report.json @@ -63,6 +63,9 @@ "VulnerabilityID": "CVE-2021-36159", "PkgID": "apk-tools@2.10.6-r0", "PkgName": "apk-tools", + "PkgIdentifier": { + "PURL": "pkg:apk/alpine/apk-tools@2.10.6-r0?arch=x86_64\u0026distro=3.10.9" + }, "InstalledVersion": "2.10.6-r0", "FixedVersion": "2.10.7-r0", "Status": "fixed", @@ -83,6 +86,10 @@ "CweIDs": [ "CWE-125" ], + "VendorSeverity": { + "nvd": 4, + "redhat": 3 + }, "CVSS": { "nvd": { "V2Vector": "AV:N/AC:L/Au:N/C:P/I:N/A:P", diff --git a/test/data/trivy.yaml b/test/data/with-trivy-yaml-cfg/trivy.yaml similarity index 71% rename from test/data/trivy.yaml rename to test/data/with-trivy-yaml-cfg/trivy.yaml index f2b0201c..33fdd4e6 100644 --- a/test/data/trivy.yaml +++ b/test/data/with-trivy-yaml-cfg/trivy.yaml @@ -2,4 +2,4 @@ format: json severity: CRITICAL vulnerability: type: os -output: yamlconfig.test \ No newline at end of file +output: yamlconfig.json \ No newline at end of file diff --git a/test/test.bats b/test/test.bats index 0d107817..1e0f3ceb 100644 --- a/test/test.bats +++ b/test/test.bats @@ -1,99 +1,123 @@ #!/usr/bin/env bats -bats_load_library bats-support -bats_load_library bats-assert -bats_load_library bats-file -@test "trivy repo with securityCheck secret only" { - # trivy repo --format json --output repo.test --scanners=secret https://github.com/krol3/demo-trivy/ - run ./entrypoint.sh '-b json' '-h repo.test' '-s secret' '-a repo' '-j https://github.com/krol3/demo-trivy/' - run diff repo.test ./test/data/repo.test +setup_file() { + local owner=$GITHUB_REPOSITORY_OWNER + export TRIVY_DB_REPOSITORY=ghcr.io/${owner}/trivy-db-act:latest + export TRIVY_JAVA_DB_REPOSITORY=ghcr.io/${owner}/trivy-java-db-act:latest + export TRIVY_POLICY_BUNDLE_REPOSITORY=ghcr.io/${owner}/trivy-checks-act:latest +} + +setup() { + bats_load_library bats-support + bats_load_library bats-assert + bats_load_library bats-file +} + +function remove_json_fields() { + local file="$1" + if [[ "$file" == *.json ]]; then + jq 'del(.CreatedAt)' "$file" > tmp && mv tmp "$file" + fi +} + +function remove_sarif_fields() { + local file="$1" + if [[ "$file" == *.sarif ]]; then + jq 'del(.runs[].tool.driver.version) | del(.runs[].originalUriBaseIds)' "$file" > tmp && mv tmp "$file" + fi +} + +function remove_github_fields() { + local file="$1" + if [[ "$file" == *.gsbom ]]; then + jq 'del(.detector.version) | del(.scanned) | del(.job) | del(.ref) | del(.sha)' "$file" > tmp && mv tmp "$file" + fi +} + +function compare_files() { + local file1="$1" + local file2="$2" + + # Some fields should be removed as they are environment dependent + # and may cause undesirable results when comparing files. + remove_json_fields "$file1" + remove_json_fields "$file2" + + remove_sarif_fields "$file1" + remove_sarif_fields "$file2" + + remove_github_fields "$file1" + remove_github_fields "$file2" + + run diff "$file1" "$file2" echo "$output" - assert_files_equal repo.test ./test/data/repo.test + assert_files_equal "$file1" "$file2" +} + +@test "trivy repo with securityCheck secret only" { + # trivy repo -f json -o repo.test --scanners=secret https://github.com/krol3/demo-trivy/ + run ./entrypoint.sh '-b json' '-h repo.json' '-s secret' '-a repo' '-j https://github.com/krol3/demo-trivy/' + compare_files repo.json ./test/data/secret-scan/report.json } @test "trivy image" { - # trivy image --severity CRITICAL --output image.test knqyf263/vuln-image:1.2.3 + # trivy image --severity CRITICAL -o image.test knqyf263/vuln-image:1.2.3 run ./entrypoint.sh '-a image' '-i knqyf263/vuln-image:1.2.3' '-h image.test' '-g CRITICAL' - run diff image.test ./test/data/image.test - echo "$output" - assert_files_equal image.test ./test/data/image.test + compare_files image.test ./test/data/image-scan/report } @test "trivy config sarif report" { - # trivy config --format sarif --output config-sarif.test . - run ./entrypoint.sh '-a config' '-b sarif' '-h config-sarif.test' '-j .' - run diff config-sarif.test ./test/data/config-sarif.test - echo "$output" - assert_files_equal config-sarif.test ./test/data/config-sarif.test + # trivy config -f sarif -o config-sarif.test ./test/data/config-sarif-report + run ./entrypoint.sh '-a config' '-b sarif' '-h config-sarif.sarif' '-j ./test/data/config-sarif-report/main.tf' + compare_files config-sarif.sarif ./test/data/config-sarif-report/report.sarif } @test "trivy config" { - # trivy config --format json --output config.test . - run ./entrypoint.sh '-a config' '-b json' '-j .' '-h config.test' - run diff config.test ./test/data/config.test - echo "$output" - assert_files_equal config.test ./test/data/config.test + # trivy config -f json -o config.json ./test/data/config-scan + run ./entrypoint.sh '-a config' '-b json' '-j ./test/data/config-scan' '-h config.json' + compare_files config.json ./test/data/config-scan/report.json } @test "trivy rootfs" { - # trivy rootfs --output rootfs.test . - run ./entrypoint.sh '-a rootfs' '-j .' '-h rootfs.test' - run diff rootfs.test ./test/data/rootfs.test - echo "$output" - assert_files_equal rootfs.test ./test/data/rootfs.test + # trivy rootfs --output rootfs.test ./test/data/rootfs-scan + # TODO: add data + run ./entrypoint.sh '-a rootfs' '-j ./test/data/rootfs-scan' '-h rootfs.test' + compare_files rootfs.test ./test/data/rootfs-scan/report } @test "trivy fs" { - # trivy fs --output fs.test . - run ./entrypoint.sh '-a fs' '-j .' '-h fs.test' - run diff fs.test ./test/data/fs.test - echo "$output" - assert_files_equal fs.test ./test/data/fs.test + # trivy fs --output fs.test ./test/data/fs-scan + # TODO: add data + run ./entrypoint.sh '-a fs' '-j ./test/data/fs-scan' '-h fs.test' + compare_files fs.test ./test/data/fs-scan/report } -@test "trivy fs with securityChecks option" { - # trivy fs --format json --scanners=vuln,config --output fs-scheck.test . - run ./entrypoint.sh '-a fs' '-b json' '-j .' '-s vuln,config,secret' '-h fs-scheck.test' - run diff fs-scheck.test ./test/data/fs-scheck.test - echo "$output" - assert_files_equal fs-scheck.test ./test/data/fs-scheck.test -} - - @test "trivy image with trivyIgnores option" { - # cat ./test/data/.trivyignore1 ./test/data/.trivyignore2 > ./trivyignores ; trivy image --severity CRITICAL --output image-trivyignores.test --ignorefile ./trivyignores knqyf263/vuln-image:1.2.3 - run ./entrypoint.sh '-a image' '-i knqyf263/vuln-image:1.2.3' '-h image-trivyignores.test' '-g CRITICAL' '-t ./test/data/.trivyignore1,./test/data/.trivyignore2' - run diff image-trivyignores.test ./test/data/image-trivyignores.test - echo "$output" - assert_files_equal image-trivyignores.test ./test/data/image-trivyignores.test + # cat ./test/data/with-ignore-files/.trivyignore1 ./test/data/with-ignore-files/.trivyignore2 > ./trivyignores ; trivy image --severity CRITICAL --output image-trivyignores.test --ignorefile ./trivyignores knqyf263/vuln-image:1.2.3 + run ./entrypoint.sh '-a image' '-i knqyf263/vuln-image:1.2.3' '-h image-trivyignores.test' '-g CRITICAL' '-t ./test/data/with-ignore-files/.trivyignore1,./test/data/with-ignore-files/.trivyignore2' + compare_files image-trivyignores.test ./test/data/with-ignore-files/report } @test "trivy image with sbom output" { # trivy image --format github knqyf263/vuln-image:1.2.3 - run ./entrypoint.sh "-a image" "-b github" "-i knqyf263/vuln-image:1.2.3" - assert_output --partial '"package_url": "pkg:apk/ca-certificates@20171114-r0",' # TODO: Output contains time, need to mock + run ./entrypoint.sh "-a image" "-b github" "-h github-dep-snapshot.gsbom" "-i knqyf263/vuln-image:1.2.3" + compare_files github-dep-snapshot.gsbom ./test/data/github-dep-snapshot/report.gsbom } @test "trivy image with trivy.yaml config" { - # trivy --config=./test/data/trivy.yaml image alpine:3.10 - run ./entrypoint.sh "-v ./test/data/trivy.yaml" "-a image" "-i alpine:3.10" - run diff yamlconfig.test ./test/data/yamlconfig.test - echo "$output" - assert_files_equal yamlconfig.test ./test/data/yamlconfig.test + # trivy --config=./test/data/with-trivy-yaml-cfg/trivy.yaml image alpine:3.10 + run ./entrypoint.sh "-v ./test/data/with-trivy-yaml-cfg/trivy.yaml" "-a image" "-i alpine:3.10" + compare_files yamlconfig.json ./test/data/with-trivy-yaml-cfg/report.json } @test "trivy image with custom docker-host" { # trivy image --docker-host unix:///var/run/docker.sock --severity CRITICAL --output image.test knqyf263/vuln-image:1.2.3 run ./entrypoint.sh '-y unix:///var/run/docker.sock' '-a image' '-i knqyf263/vuln-image:1.2.3' '-h image.test' '-g CRITICAL' - run diff image.test ./test/data/image.test - echo "$output" - assert_files_equal image.test ./test/data/image.test + compare_files image.test ./test/data/image-scan/report } @test "trivy config with terraform variables" { - # trivy config --format json --severity MEDIUM --output tfvars.test --tf-vars ./test/data/dev.tfvars ./test/data - run ./entrypoint.sh "-a config" "-j ./test/data" "-h tfvars.test" "-g MEDIUM" "-x dev.tfvars" "-b json" - run diff tfvars.test ./test/data/tfvars.test - echo "$output" - assert_files_equal tfvars.test ./test/data/tfvars.test + # trivy config -f json -o tfvars.json --severity MEDIUM --tf-vars ./test/data/with-tf-vars/dev.tfvars ./test/data/with-tf-vars/main.tf + run ./entrypoint.sh "-a config" "-j ./test/data/with-tf-vars/main.tf" "-h tfvars.json" "-g MEDIUM" "-x ./test/data/with-tf-vars/dev.tfvars" "-b json" + compare_files tfvars.json ./test/data/with-tf-vars/report.json } \ No newline at end of file