Security audit

Source-level review of the vendored fragglet/lhasa decoder.

Attack surface

Lhasa is a decoder. The attack surface is essentially the LHA-format parser plus a tight set of output paths. Compared to an encoder+decoder (the original lha binary), lhasa is a much smaller target.

The decode kernels are short and well-isolated: each lib/lh*_decoder.c is ~600 LoC of pure C with no extern state outside the decoder object.

CVE history

No public CVEs filed against fraggle / lhasa or vendored lhasa derivations as of 2026-07-15. Notable historical issues fixed in upstream (per NEWS):

The 0.6.0 read-overflow fix is the most recent CVE-relevant change. The vendored copy in upstream/lhasa/ is at HEAD 75ed835, which includes the v0.6.0 fix.

Fuzz readiness

Lhasa ships a libFuzzer harness in test/fuzzer.c against the liblhasa entry points. The full corpus of upstream tests + fuzz findings is what lhasa's regression suite runs against via make check.

We do not yet run continuous fuzzing against the vendored copy in ljh-sh/lhasa's CI — that's a future addition (likely an OSS-Fuzz integration once the upstream is enrolled). For now, the 0.6.0 read-overflow fix is the most recent piece of evidence that upstream fuzzing is reaching production code.

Supply-chain hygiene

Threat model & residual risk

Realistic threats ljh-sh/lhasa faces:

The decoder-only design is the central safety claim. lhasa cannot emit harmful content; it only renders what the archive contains. Compare with general-purpose decoders like tar / unrar, which have larger attack surfaces (more format families, more output paths, more fork/exec history).

Vulnerability disclosure

Email: fragglet@gmail.com (upstream maintainer — for issues in the vendored code). For ljh-sh/lhasa distribution-specific issues (build pipeline, CI, release artifacts), open an issue at github.com/ljh-sh/lhasa/issues.