anchore / anchore/syft

Syft does not use parent pom.xml for license detection if MANIFEST.MF contains Bundle-License

Open
#4,747 5 comments 0 reactions 0 assignees View on GitHub
bug good-first-issue
Dominant language
Go
Stars
9.6k
Forks
962
Avg merge
23h 27m
Merged PRs (30d)
48

Description

**What happened**:

Try to generate an SBOM for a project that contains for example `ch.qos.logback.logback-core`

`logback-core` has its license defined in parent pom (`ch.qos.logback.logback-parent`) as well as inside the `MANIFEST.MF`. License data from parent pom is ignored at the moment.

See https://repo1.maven.org/maven2/ch/qos/logback/logback-core/1.5.18/logback-core-1.5.18.pom for example.

**What you expected to happen**:

License data from parent pom is taken, because it is often more precise. `pom.xml` has better ways of representing multi-license projects. See https://repo1.maven.org/maven2/ch/qos/logback/logback-parent/1.5.18/logback-parent-1.5.18.pom for `example.`

License data from `MANIFEST.MF` is not as good, because Syft just takes the value as-is and does not enrich it.

Best output would be a valid license EXPRESSION: For logback-core, it should be something like this:

```
"licenses": [
{
"expression": "EPL-1.0 OR LGPL-2.1-only"
}
]
```

`MANIFEST.MF` from `logback-core`:

Image

This is the Syft output:
Syft thinks that there is only one license available.

```
{
"bom-ref": "pkg:maven/ch.qos.logback/logback-core@1.5.18?package-id=c389ecb99d8108eb",
"type": "library",
"group": "ch.qos.logback",
"name": "logback-core",
"version": "1.5.18",
"licenses": [
{
"license": {
"name": "http://www.eclipse.org/legal/epl-v10.html, http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html"
}
}
],
"cpe": "cpe:2.3:a:logback-core:logback-core:1.5.18:*:*:*:*:*:*:*",
"purl": "pkg:maven/ch.qos.logback/logback-core@1.5.18",
"externalReferences": [
{
"url": "",
"hashes": [
{
"alg": "SHA-1",
"content": "6c0375624f6f36b4e089e2488ba21334a11ef13f"
}
],
"type": "build-meta"
}
],
"properties": [
{
"name": "syft:package:foundBy",
"value": "java-archive-cataloger"
},
{
"name": "syft:package:language",
"value": "java"
},
{
"name": "syft:package:type",
"value": "java-archive"
},
{
"name": "syft:package:metadataType",
"value": "java-archive"
},
{
"name": "syft:cpe23",
"value": "cpe:2.3:a:logback-core:logback_core:1.5.18:*:*:*:*:*:*:*"
},
{
"name": "syft:cpe23",
"value": "cpe:2.3:a:logback_core:logback-core:1.5.18:*:*:*:*:*:*:*"
},
{
"name": "syft:cpe23",
"value": "cpe:2.3:a:logback_core:logback_core:1.5.18:*:*:*:*:*:*:*"
},
{
"name": "syft:cpe23",
"value": "cpe:2.3:a:logback:logback-core:1.5.18:*:*:*:*:*:*:*"
},
{
"name": "syft:cpe23",
"value": "cpe:2.3:a:logback:logback_core:1.5.18:*:*:*:*:*:*:*"
},
{
"name": "syft:cpe23",
"value": "cpe:2.3:a:qos-ch:logback-core:1.5.18:*:*:*:*:*:*:*"
},
{
"name": "syft:cpe23",
"value": "cpe:2.3:a:qos-ch:logback_core:1.5.18:*:*:*:*:*:*:*"
},
{
"name": "syft:cpe23",
"value": "cpe:2.3:a:qos_ch:logback-core:1.5.18:*:*:*:*:*:*:*"
},
{
"name": "syft:cpe23",
"value": "cpe:2.3:a:qos_ch:logback_core:1.5.18:*:*:*:*:*:*:*"
},
{
"name": "syft:location:0:layerID",
"value": "sha256:e9ef3023efd7d4b4dccc5964a23f5c674cb62bde4bbc7d0fae5c8a09fe6ead74"
},
{
"name": "syft:location:0:path",
"value": "/opt/app/detact-apps.jar"
},
{
"name": "syft:metadata:-:artifactID",
"value": "logback-core"
},
{
"name": "syft:metadata:-:groupID",
"value": "ch.qos.logback"
},
{
"name": "syft:metadata:virtualPath",
"value": "/opt/app/detact-apps.jar:BOOT-INF/lib/logback-core-1.5.18.jar"
}
]
}
```

**Steps to reproduce the issue**:

Create project/image containing logback-core 1.5.18
Create Syft CycloneDX SBOM using the following syft config:

```
# https://oss.anchore.com/docs/reference/syft/configuration/

log:
level: trace

javascript:
include-dev-dependencies: false

file:
metadata:
selection: none # we don't want any files in out SBOMs as of now

select-catalogers:
- +javascript-lock-cataloger

java:
resolve-transitive-dependencies: true
max-parent-recursive-depth: -1 # no limit
use-network: true
maven-url: "https://repo1.maven.org/maven2,https://packages.confluent.io/maven"

enrich: "all"

```

**Anything else we need to know?**:

I found https://github.com/anchore/syft/issues/4260 earlier and thought this bug is present again, but `logback-core` has a `pom.properties`. That's the reason why I think the MANIFEST.MF file is the reason for the parent pom not being used.

**Environment**:
- Syft version: 1.42.3

**EDIT**: another good example is the usage of the maven package `antlr4-runtime`

`MANIFEST.MF` contains some unusable URL, but parent `pom.xml` of the project actually contains a usable SPDX identifier.

Image

Image

Contributor guide

Open the contributing guide

Research direction

Start with Syft's Java archive cataloging and Maven parent-POM license resolution, then compare how MANIFEST.MF and pom.xml license data are prioritized. Reproduce with logback-core 1.5.18 and antlr4-runtime using the supplied configuration, and confirm that the generated CycloneDX output preserves the parent POM's SPDX license expression.

Written by the indexing model from the issue text.

Assessment

Tech stack
java
Domain
devtools, security
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Active
Clarity
Mostly clear
Newbie friendliness
55/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.