Manjaro SafeAUR Updater 1.4.0
This project is maintained by one person and carries no backport branches.
Fixes land on main and go out in the next tagged release. Only the newest
release is supported; there is no long-term-support line and older tags do not
receive patches.
| Version | Supported |
|---|---|
main |
✅ fixes land here first |
| Newest tagged release | ✅ |
| Any earlier tag | ❌ upgrade to the newest release |
The releases page lists
every tag, newest first, and each release's notes record what changed in it.
This project keeps that history in the release notes rather than in a
CHANGELOG.md.
If you are running a checkout you pulled weeks ago, git pull and retry before
reporting — the issue may already be fixed. Include what you are running:
git -C /path/to/manjaro-safeaur-updater describe --tags --always --dirtyA -dirty suffix means the working tree has local modifications, and a hash
with no tag means the checkout is somewhere between releases. Say so in the
report either way — it changes what I can reproduce.
Say which distribution you are on and which third-party repositories you have
enabled (pacman-conf --repo-list). This tooling keys its behaviour off what is
in pacman.conf, not off a branch name, so "Manjaro Stable with BlackArch"
and "Manjaro Testing with chaotic-aur" are different paths through the same
script.
I take the security of this project seriously. If you discover a security vulnerability, please do not open a public issue.
Instead, please report it privately by emailing the report to: spilled-bowline0j@icloud.com
What to expect:
- Acknowledgment: You will receive an initial response to your report within 72 hours.
- Updates: I will keep you informed of my progress as I investigate the issue and develop a fix.
- Resolution: If the vulnerability is accepted, I will address it promptly in a new release and notify you. If declined, I will provide a clear explanation of my reasoning.
Please include as much detail as possible in your email, including steps to reproduce.
This tooling decides what gets installed on your machine and from where. It
runs pacman under sudo, writes to /etc/pacman.conf, and gates an AUR
helper that will execute arbitrary upstream build scripts if it is allowed to.
A bug here does not degrade a feature — it installs something you did not agree
to install. That is the interesting surface:
- A gate that passes when it should fail.
aur-pin-checkis the only thing standing betweenaurinstall/aurupdateand an unpinned VCS source. Anysource=line that reachesyaywithout either a#commit=<40-hex>fragment or a currently verifying allowlist row is a vulnerability, not a parsing quirk. A skipped check counted as a pass is the same bug: a package that could not be fetched, parsed or resolved must be reported as an error and must never exit 0. - The allowlist failing to notice a moved tag. The allowlist's entire value
is that it re-resolves each vetted tag with
git ls-remoteon every run and refuses the package the moment the SHA stops matching. A tag that has moved and is still accepted — because the resolution silently failed, because the comparison was case- or whitespace-sensitive in the wrong direction, or because an empty result was treated as agreement — is the exact failure this design exists to prevent. - Allowlist row matching too broadly. A row is scoped to one package and one exact source spec. A row that launders a different source in the same package, or the same source in a different package, is a finding.
- Executing what it was asked to inspect.
aur-pin-checkdeliberately reads.SRCINFO— the post-evaluation static form — precisely so that vetting an untrusted package name never runs that package's code. Any change that sources, evals, or otherwise executes PKGBUILD content, or that lets.SRCINFOcontent reach a shell as code, is in scope. Package names come from the command line and fromyay -Qua;.SRCINFObodies come from the network. Neither is trusted input. - Argument injection into pacman or yay. Package names flow into
pacman -Si,pacman -T,--ignorelists andyay -S. A crafted name that becomes an option rather than an operand — anything that could turn into--noconfirm,--overwrite,-U, a second--config, or a path — is a vulnerability. safeup's auto-hold selecting the wrong packages. The recovery path parses pacman's own output with a regular expression and feeds the result into--ignore. A pattern that over-matches silently holds back packages you needed — including security updates, which is the serious case — and one that under-matches strands the upgrade. Both are in scope. So is anything that causes the retry loop to report success on a transaction that did not happen.- A hold that is not reported. Every held or auto-skipped package must reach
both the terminal and
/var/log/safeup.log. A package held silently is a package you will still be running, unpatched, in six months without knowing. lddon attacker-supplied binaries.aur-rebuild-checkrunslddover every file owned by every foreign package.lddis not unconditionally safe on a hostile ELF — on some platforms and for some malformed objects it can result in the binary's own interpreter being executed. Anything that widens what gets passed toldd, or that runs it as a more privileged user than necessary, is worth reporting.aur-rebuild-checkneeds no privileges and should never be run as root.remove-versioned-kernelremoving the wrong thing. Its three guards — the name must matchlinuxNN, it must not be the running kernel, and it must not be the last versioned kernel installed — each prevent an unbootable machine. Any of them failing to fire on a system that meets its condition is a serious bug.--noconfirmsuppresses the prompt only; a change that lets it suppress a guard is a vulnerability.- The
IgnorePkgrewrite. It replaces a line in/etc/pacman.confby line number after taking a timestamped backup. Writing outside that line, dropping the nvidia userspace entries that must stay held in lockstep, corrupting the file, or leavingpacman.confin a state where a subsequent upgrade does something unintended, is in scope. deploy.shwriting to the wrong place, or trusting the wrong thing. It installs root-owned executables into/usr/local/binand runspacman -Sundersudo. A path that can be influenced from outside the checkout, a backup that clobbers the previous backup (so the pre-change state is unrecoverable), or an installed file left group- or world-writable, is a finding. So is the AUR bootstrap path fetchingyay-binwithout showing the PKGBUILD, or building it as root.- Anything world-writable, or any secret in a log.
/var/log/safeup.logis0644by design and holds package names only. Anything else appearing in it is a finding. - A test suite that touches a real system.
tests/loopback-core-test.shmust confine every write to its own loop device and temporary directory, and must never modify the host's package database,/etc, or any real disk.tests/pin-fixture-test.shmust touch no disk beyond$TMPDIRand must make no network request.
- Malicious content in a PKGBUILD that is correctly pinned. Pinning proves you will build the same commit you reviewed. It is not a claim that the commit is safe. Reviewing the PKGBUILD is still your job, and the README says so.
makepkgnot being sandboxed. Builds run upstream's build system as your user. That is how the AUR works; this suite gates which commit gets built, not what building it is permitted to do.- Bugs in the software this drives —
pacman,yay,makepkg,libalpm,git,curl,ldd. Report those upstream. - Manjaro's release lag itself. The two-week delay behind Arch is Manjaro's design decision. This tooling handles its consequences; the decision is not a vulnerability in this tooling.
- A held package staying held. That is the guard working. If Manjaro never ships the dependency, the package stays held forever, and the answer is to stop using that package or stop using Manjaro — not to weaken the check.
- The AUR being unsupported by Manjaro. Documented by Manjaro, quoted in the README, and the reason this project exists.
aurinstall/aurupdatebeing bypassable by callingyaydirectly. That is deliberate and documented. The gate exists to make the bypass a conscious decision, not to prevent it. A gate that could not be bypassed would just get uninstalled.
Nothing this suite produces is key material, so the stakes are lower here than in a tool that handles secrets. Two things are still worth a look before you paste:
/var/log/safeup.loglists package names and timestamps. That is a reasonable fingerprint of what you run and when you update. Usually fine to send; read it first./etc/aur-pin-check/allowlist.confnames every AUR package you decided to trust, with upstream URLs. Same consideration.pacman.confidentifies every repository and mirror you use, including private or internal ones. Redact those before posting.pacman -Qmoutput is a complete inventory of your foreign packages. Send the relevant lines, not the whole list.
Send the smallest thing that demonstrates the problem. For a security report, send it to the email address above rather than attaching it to an issue.