Review for Source Package: rust-hwlib
[Summary]
This Rust binary ("hwctl") queries the https://hw.ubuntu.com endpoint for
specific
CPU and hardware info, to check if the system runs on a certified device. It's
an Ubuntu/Canonical only solution. The output is structured JSON data, to be
consumed by "Ubuntu Pro". It's actively maintained in upstream/GitHub, but not
yet packaged in the archives. The Rust application code itself is fairly small
(~1k LoC), but comes with a huge pile of vendored crates (~1M LoC).
MIR team ACK under the constraint to resolve the below listed
required TODOs and as much as possible having a look at the
recommended TODOs.
This does need a security review, so I'll assign ubuntu-security
List of specific binary packages to be promoted to main: hwctl
Specific binary packages built, but NOT to be promoted to main: <None>
Notes:
#0 - Flagging for security review, due to parsing of system/device data and
parsing of HTTP responses from a centralized (trusted?) endpoint,
hw.ubuntu.com which can easily be modified at runtime via HW_API_URL
Required TODOs:
#1 - The binary is expected to run as root, but only needs access to specific
system data. Consider adding an apparmor profile for restricting it to the
mandatory data access. (I'm unclear about this, could potentially be
downgraded to a Recommended TODO.)
#2 - The autopkgtests is just a re-execution of the unit tests, including
re-compile, so not testing the actual, installed binaries. Adding a simple
integration tests, using a mock HTTP server to simulate hw.ubuntu.com and
make a test request using the real binary would be very valuable.
#3 - Please explain the release (upstream) release process, I see "Revision XXX"
as releases on GitHub, but this package (the hwlib client) uses versions
like v0.9.0 which are not referenced upstream.
#4 - Please explain the arch:amd64 limitation. I see arm64/rpi4b8g in test data
but the package is not built for arm64 or any other arch besides amd64.
Doesn't the Pro client need the data for devices of any architecture?
Recommended TODOs:
#5 - The package should get a team bug subscriber before being promoted
#6 - d/vendor-rust.sh: Consider using "cargo vendor-filterer" with the following
arguments "--platform '*-*-linux-gnu' --platform '*-*-linux-gnueabi'" to
avoid unnecessary windows crates
#7 - d/rules: Consider using a VENDOR_TARBALL for crates, see "vendor-tarball"
target in this example makefile:
https://github.com/canonical/ubuntu-mir/blob/main/vendoring/Rust.md#automation-via-debianrules
#8 - Consider fixing some lintian warnings, especially those (see below for more
warnings and details):
W: hwctl: synopsis-too-long
I: rust-hwlib source: override_dh_auto_test-does-not-check-DEB_BUILD_OPTIONS
[debian/rules:28]
P: rust-hwlib source: uses-debhelper-compat-file [debian/compat]
#9 - Consider fixing some build-time warnings, especially this one (see below
for more warnings and details):
warning: use of deprecated method `std::error::Error::description`: use the
Display impl or to_string()
[Rationale, Duplication and Ownership]
- There is no other package in main providing the same functionality.
=> Custom Canonical solution for checking hardware certification status.
- A team is committed to own long term maintenance of this package.
=> ~canonical-hw-cert
- The rationale given in the report seems valid and useful for Ubuntu.
[Dependencies]
OK:
- no other Dependencies to MIR due to this
- SRCPKG checked with `check-mir`
- all dependencies can be found in `seeded-in-ubuntu` (already in main)
- none of the (potentially auto-generated) dependencies (Depends
and Recommends) that are present after build are not in main
- no -dev/-debug/-doc packages that need exclusion
- No dependencies in main that are only superficially tested requiring
more tests now.
Problems: None
[Embedded sources and static linking]
OK:
- not a go package, no extra constraints to consider in that regard
- does not have unexpected Built-Using entries
- Rust package that has all dependencies vendored. It does neither
have *Built-Using (after build). Nor does the build log indicate
built-in sources that are missed to be reported as Built-Using.
- rust package using dh_cargo (dh ... --buildsystem cargo)
- Includes vendored code, the package has documented how to refresh this
code at ./README.md
Problems:
- embedded source present (vendored Rust dependencies)
- Rust, using static linking of the final binary
[Security]
OK:
- history of CVEs does not look concerning (new application, Jan 2024)
- does not run a daemon as root
- does not use webkit1,2 (references in
rust-vendor/vcpkg/../boost-build_1.67.0_x64-windows.list)
- does not use lib*v8 directly
- does not process arbitrary web content
- does not integrate arbitrary javascript into the desktop
- does not deal with system authentication (eg, pam), etc)
- does not deal with security attestation (secure boot, tpm, signatures)
Problems:
- does use centralized online accounts (services actually):
https://hw.ubuntu.com
- does parse data formats (cpuinfo.rs, hardware_info.rs, HW_API_URL) from
an untrusted source.
- does deal with cryptography (validation of signatures in JSON responses)
- does not expose any external endpoint (but utilizes "socket2" create via
"tokio" & "hyper-util")
- this makes appropriate (for its exposure) use of established risk
mitigation features (apparmor)
=> The binary is expected to run as root, but only needs access to specific
system data. Consider adding an apparmor profile for restricting it to the
mandatory data access.
[Common blockers]
OK:
- does not FTBFS currently
- does have a test suite that runs at build time
- test suite fails will fail the build upon error.
- This does not need special HW for build or test
- no new python2 dependency
- Not a Python package
- Not a Go package
Problems:
- does have a test suite that runs as autopkgtest, but it's just a re-execution
of the unit tests, including re-compile, so not testing the actual, installed
binaries. Adding a simple integration tests, using a mock HTTP server to
simulate hw.ubunut.com and make a test request using the real binary would
be very valuable.
[Packaging red flags]
OK:
- Ubuntu does carry a delta, but it is reasonable and maintenance under
control (Ubuntu only package)
- symbols tracking not applicable for this kind of code.
- debian/watch is not present but also not needed (e.g. native)
- Upstream update history is good
- promoting this does not seem to cause issues for MOTUs that so far
maintained the package
- debian/rules is rather clean (not clean, but OKish. As it needs to deal with
Rust vendoring)
- It is not on the lto-disabled list
Problems:
- Debian/Ubuntu update history is sporadic (not yet packaged)
- d/control: Architecture: amd64 (but raspi as certified device in tests)
- d/vendor-rust.sh: use cargo vendor-filterer --platform '*-*-linux-gnu'
--platform '*-*-linux-gnueabi' to avoid windows crates
- d/rules: consider using a VENDOR_TARBALL for crates, see "vendor-tarball"
target in this example makefile:
https://github.com/canonical/ubuntu-mir/blob/main/vendoring/Rust.md#automation-via-debianrules
- the current release is packaged
=>Yes, but it does not match the releases/Revisions of the Github project
- lintian warnings:
X: librust-hwlib-dev: package-contains-no-arch-dependent-files
I: rust-hwlib source: override_dh_auto_test-does-not-check-DEB_BUILD_OPTIONS
[debian/rules:28]
N: The debian/rules file for this package has an override_dh_auto_test target
N: that does not appear to check DEB_BUILD_OPTIONS against nocheck.
W: hwctl: synopsis-too-long
N: The first line of the "Description:" must be less than 80 characters long.
P: rust-hwlib source: uses-debhelper-compat-file [debian/compat]
N: debhelper has replaced debian/compat with the debhelper-compat virtual
N: package for most circumstances, e.g. Build-Depends: debhelper-compat (= 13)
I: hwctl: hardening-no-fortify-functions
[Upstream red flags]
OK:
- no Errors/warnings during the build
- no incautious use of malloc/sprintf (the language has no direct MM)
- no use of sudo, gksu, pkexec, or LD_LIBRARY_PATH (usage is OK inside tests)
- no use of user nobody
- no use of setuid / setgid
- no important open bugs (crashers, etc) in Debian or Ubuntu
- no dependency on webkit, qtwebkit or libseed
- not part of the UI for extra checks
- no translation present, but none needed for this case (user visible)?
Problems:
- some usage of malloc/sprintf in rust-vendor/ (libc, openssl, ring/crypto,
pyo3-ffi)
- manpage: BUGS: Only amd64 architecture is currently supported.
- warnings during build:
warning: unexpected `cfg` condition value: ...
warning: `...` (lib) generated XX warning
warning: elided lifetime has a name
warning: trait `AssertSync` is never used
warning: ambiguous wide pointer comparison, the comparison includes metadata
which may not be expected
warning: lint `illegal_floating_point_literal_pattern` has been removed: no
longer a warning, float patterns behave the same as `==`
warning: use of deprecated method `std::error::Error::description`: use the
Display impl or to_string()
warning: unused import
** Changed in: Ubuntu Plucky
Status: New => Incomplete
** Changed in: Ubuntu Plucky
Status: Incomplete => Confirmed
** Changed in: Ubuntu Plucky
Assignee: Lukas Märdian (slyon) => Ubuntu Security Team (ubuntu-security)
--
You received this bug notification because you are a member of Ubuntu
Bugs, which is subscribed to Ubuntu.
https://bugs.launchpad.net/bugs/2072561
Title:
[MIR] rust-hwlib
To manage notifications about this bug go to:
https://bugs.launchpad.net/ubuntu/+bug/2072561/+subscriptions
--
ubuntu-bugs mailing list
[email protected]
https://lists.ubuntu.com/mailman/listinfo/ubuntu-bugs