specs: add ELF references draft
ci/woodpecker/push/woodpecker Pipeline was successful
Details
ci/woodpecker/push/woodpecker Pipeline was successful
Details
parent
db89f9a5ae
commit
8c91e43e7a
|
@ -0,0 +1,217 @@
|
|||
---
|
||||
title: "Embeddable URI references for ELF binaries"
|
||||
---
|
||||
|
||||
*This specification is a work in progress, and has not been
|
||||
submitted to any standards body for peer review. Do not use
|
||||
this specification in any production capacity.*
|
||||
|
||||
## Abstract
|
||||
|
||||
*This section is non-normative.*
|
||||
|
||||
Identifying the provenance of binary software components is
|
||||
an important topic in the software servicing lifecycle with
|
||||
numerous use-cases. [Software Bill of Materials][sbom]
|
||||
documents provide a reference allowing the identification of
|
||||
underlying software components present in a binary software
|
||||
package. However, linking specific [Executable and Linking Format][elf]
|
||||
binary objects in a software package to an SBOM document
|
||||
varies depending on how the software package is built and
|
||||
distributed.
|
||||
|
||||
ELF references provide typed URIs which can be embedded in
|
||||
ELF binaries as `SHT_NOTE` sections, providing the ability
|
||||
to have an embedded copy of, or pointer to, any resource
|
||||
including an SBOM document, allowing for universal
|
||||
correlation between ELF binaries and their SBOM.
|
||||
|
||||
## The ELF `.reference` note
|
||||
|
||||
The `.reference` note is an `SHT_NOTE` typed section, with
|
||||
the assigned section name `.reference`, with two sections.
|
||||
|
||||
`SHT_NOTE` sections are described on page 2-4 of the [ELF
|
||||
specification][elf], and the `.reference` note follows
|
||||
this description.
|
||||
|
||||
### The `.reference` name section
|
||||
|
||||
The `namesz` and `name` fields are used to describe the
|
||||
reference type. The type of the reference is optional
|
||||
and *may* be omitted. If the type of the reference is
|
||||
provided, then it *must* comply with [RFC 6838][rfc6838],
|
||||
including the [naming requirements in its section 4.2][rfc6838-naming].
|
||||
|
||||
The `namesz` field *must* be set to `0` if the `.reference`
|
||||
note does not have a type, otherwise it *must* be set to
|
||||
the length of the typed URI in bytes with padding to ensure
|
||||
4-byte alignment.
|
||||
|
||||
Any padding bytes present as part of the `name` field *must*
|
||||
be set to `NUL` (`0x0`).
|
||||
|
||||
### The `.reference` descriptor section
|
||||
|
||||
The `descsz` and `desc` fields are used for the reference
|
||||
URI in the `.reference` note, which *must* be present.
|
||||
|
||||
The `descsz` field *must* be set to the length of the
|
||||
reference URI with padding to ensure 4-byte alignment.
|
||||
|
||||
Any padding bytes present as part of the `desc` field *must*
|
||||
be set to `NUL` (`0x0`).
|
||||
|
||||
### Multiple `.reference` sections are allowed
|
||||
|
||||
There may be multiple `.reference` note sections in an ELF
|
||||
object per the [ELF specification][elf], page 1-15:
|
||||
|
||||
> The object file format lets one define sections not in the
|
||||
> list above. An object file may have more than one section
|
||||
> with the same name.
|
||||
|
||||
## Well-known types of `.reference` sections
|
||||
|
||||
*This section is non-normative.*
|
||||
|
||||
This spec proposes a minimum set of well-known types to use
|
||||
as typed URIs in `.reference` sections:
|
||||
|
||||
- Media Type: `text/spdx`
|
||||
|
||||
Purpose: The `.reference` section defines a reference to an
|
||||
SPDX document in tagged-value format.
|
||||
|
||||
- Media Type: `application/spdx+json`
|
||||
|
||||
Purpose: The `.reference` section defines a reference to an
|
||||
SPDX document in JSON format, such as an SPDX 2.2 JSON document.
|
||||
|
||||
- Media Type: `application/ld+json; profile="http://spdx.org/rdf/types"`
|
||||
|
||||
Purpose: The `.reference` section defines a reference to an
|
||||
SPDX document in JSON-LD format, such as an SPDX 3.0 document.
|
||||
|
||||
- Media Type: `application/vnd.cyclonedx+json`
|
||||
|
||||
Purpose: The `.reference` section defines a reference to a
|
||||
CycloneDX document in JSON format.
|
||||
|
||||
- Media Type: `application/vnd.cyclonedx+xml`
|
||||
|
||||
Purpose: The `.reference` section defines a reference to a
|
||||
CycloneDX document in XML format.
|
||||
|
||||
- Media Type: `application/x.vnd.purl`
|
||||
|
||||
Purpose: The `.reference` section defines a [package URL][purl].
|
||||
|
||||
Other media types *may* be used, provided they meet the [naming
|
||||
requirements of RFC 6838][rfc6838-naming].
|
||||
|
||||
## Examples
|
||||
|
||||
*This section is non-normative.*
|
||||
|
||||
### Using `data:` URIs to embed text data
|
||||
|
||||
*This section is non-normative.*
|
||||
|
||||
This example embeds the text `Hello world!` as a `data:` URI
|
||||
inside a `.reference` section:
|
||||
|
||||
```
|
||||
{
|
||||
namesz: 12,
|
||||
descsz: 56,
|
||||
type: 1,
|
||||
name: "text/plain\0\0",
|
||||
desc: "data:text/plain;charset=utf-8;base64,SGVsbG8gd29ybGQh\0\0\0"
|
||||
}
|
||||
```
|
||||
|
||||
### Referencing an SPDX SBOM document
|
||||
|
||||
*This section is non-normative.*
|
||||
|
||||
This example embeds `https://example.org/sbom.spdx` as a
|
||||
`.reference` section:
|
||||
|
||||
```
|
||||
{
|
||||
namesz: 12,
|
||||
descsz: 32,
|
||||
type: 1,
|
||||
name: "text/spdx\0\0\0",
|
||||
desc: "https://example.org/sbom.spdx\0\0\0"
|
||||
}
|
||||
```
|
||||
|
||||
### Referencing a CycloneDX SBOM document
|
||||
|
||||
*This section is non-normative.*
|
||||
|
||||
This example embeds `https://example.org/sbom.cdx.json` as a
|
||||
`.reference` section:
|
||||
|
||||
```
|
||||
{
|
||||
namesz: 32,
|
||||
descsz: 36,
|
||||
type: 1,
|
||||
name: "application/vnd.cyclonedx+json\0\0",
|
||||
desc: "https://example.org/sbom.cdx.json\0\0\0"
|
||||
}
|
||||
```
|
||||
|
||||
### Referencing a Package URL
|
||||
|
||||
*This section is non-normative.*
|
||||
|
||||
This example embeds `pkg:apk/alpine/nano@6.3-r0?arch=x86_64`
|
||||
as a `.reference` section:
|
||||
|
||||
```
|
||||
{
|
||||
namesz: 24,
|
||||
descsz: 40,
|
||||
type: 1,
|
||||
name: "application/x.vnd.purl\0\0",
|
||||
desc: "pkg:apk/alpine/nano@6.3-r0?arch=x86_64\0\0"
|
||||
}
|
||||
```
|
||||
|
||||
## Acknowledgements
|
||||
|
||||
*This section is non-normative.*
|
||||
|
||||
The author of this specification wishes to express her
|
||||
gratitude to [Laurent Bercot][skarnet] for reviewing the
|
||||
initial concept. While that concept did not emerge unscathed
|
||||
from his review, the specification that resulted is both more
|
||||
composable and generic as a result.
|
||||
|
||||
[skarnet]: https://www.skarnet.org/
|
||||
|
||||
## References
|
||||
|
||||
* [Software Bill of Materials][sbom] specification as written
|
||||
by CISA.
|
||||
|
||||
[sbom]: https://www.cisa.gov/sbom
|
||||
|
||||
* [Executable and Linking Format][elf] specification as written
|
||||
by the TIS Committee.
|
||||
|
||||
[elf]: https://refspecs.linuxfoundation.org/elf/elf.pdf
|
||||
|
||||
* [RFC 6838][rfc6838] specification as published by the IETF,
|
||||
ISSN 2070-1721.
|
||||
|
||||
[rfc6838]: https://www.rfc-editor.org/rfc/rfc6838
|
||||
[rfc6838-naming]: https://www.rfc-editor.org/rfc/rfc6838#section-4.2
|
||||
|
||||
* [Package URL][purl] specification.
|
||||
|
||||
[purl]: https://github.com/package-url/purl-spec
|
Loading…
Reference in New Issue