No. 17 · 31 October 2026 · Security · Supply Chain

Mostly Harmless: a no-execution audit of PhotoCraft 0.17.0 for backdoors, phone-home and leaks

We audited an open-source Photoshop rewrite without running a line of it. Nothing covert turned up. The weak point is the road new code arrives by: on Linux the updater has only TLS between an attacker and an install, and the signing secrets go to a shared workflow on a moving branch.

In plain terms: PhotoCraft is a free image editor, written in the Rust programming language to work like Adobe's Photoshop, whose code anyone can read. We read its code and its downloads, without running any of it, looking for hidden ways in, quiet reporting home, and leaks of personal data.

The program itself came back clean. The trouble is in how its updates arrive. On Linux, an update's only protection is TLS, the encryption behind the padlock in a browser's address bar. TLS trusts a site because a certificate authority, a company your computer is set up to trust, vouches for it. Certificates belonging to one such company, eMudhra, were reported compromised in October; their private keys "are now well known." The security library in PhotoCraft 0.17.0 may still accept them, so on a computer that still trusts the affected certificates, someone on the network could pass off a fake update, if the user accepts it. Separately, the keys that sign its Mac and Windows releases are handed to shared build code that follows a changeable version rather than a fixed one.

Why it matters to you: if you install software from the internet, the update button is a door. This essay is about who else might be able to use it.

We audited PhotoCraft 0.17.0, an open-source Rust reimplementation of Photoshop, for backdoors, phone-home behavior, data and personal-information leakage, and onerous legal terms, without running any of its code 4. We found nothing covert: no telemetry, no analytics, no hidden network listener, and no recovered registry-crate source path naming a package absent from Cargo.lock (the file that lists every outside package, or crate, the program is built from, at exact versions) 14. We found two weaknesses, both on the road new code arrives by. On Linux, the updater authenticates a new release only by a SHA-256 (a digital fingerprint of the file) fetched over the same TLS connection as the release, and the certificate verifier in 0.17.0, rustls-webpki 0.103.15, is affected by RUSTSEC-2026-0382 (an advisory in RustSec, the Rust community's vulnerability database) 25. Where a machine still trusts the roots behind the compromised eMudhra intermediates (certificates that sit between a trusted root certificate and the websites it vouches for), our source-based assessment is that an on-path attacker (someone positioned on the network between the user and the download) could serve a forged update, provided the user accepts it 57. Separately, the release pipeline hands its Apple and Windows signing credentials to a shared workflow that follows a mutable branch (automated release code, kept in another repository, that runs whatever its latest version is) 119. Up-to-date Ubuntu 24.04 trusts neither root 8; the machine we audited from trusted both 4. On a 0.0 (benign) to 10.0 (dangerous) scale, PhotoCraft 0.17.0 scores Hawthorne 3.8, Species III (Species grades how far a weakness could reach, from I, one person, to IV, the world) 42021. This audit covers 0.17.0 only. PhotoCraft 0.18.0 shipped on 31 October, the day this essay was published, and we have not audited it. Its lockfile still pins the affected verifier, what we can see of it follows the contours of this analysis, and we have no reason to believe any conclusion here has changed. PhotoCraft stays on the list of projects we track 26.

Drafts here go through the Moot before I read them: a panel of frontier models I call by their lab bosses' first names (Dario, Sam, Sundar), plus Eddie, the house model that drafts and rules on their objections. This one took three rounds of review. The first draft dropped most of the findings, so it was rewritten from the audit's evidence database; that departs from the usual process, and it is logged 4. Then three outside readers (Claude, OpenAI, Gemini) sent critiques, and this version is what came back. The reviews caught real errors of ours: a CVE label (the public ID number given to a known vulnerability) we first applied too narrowly and then too broadly, a shell launch we had written off as test code, and a scored finding about the CLI bridge that the code already prevents. They also introduced errors of their own. We checked those against the captured sources and reverted them; where a reviewer and a primary source disagreed, the source won. Every source line cited below was re-read on 31 October 2026.

We found no evidence of covert behavior in the PhotoCraft 0.17.0 material inspected; this static audit cannot establish its absence. It phones home only to check GitHub for updates, says so in its preferences, and lets you turn that off 1. Its local listeners are loopback-only (reachable only from the same computer) and token-protected; its MCP transport (the channel through which AI assistants can drive the app, using the Model Context Protocol) uses standard input and output, while its separate headless JSON-lines server also supports loopback TCP; and it reads the clipboard when you paste, when opening New from Clipboard, and when the New Document dialog opens to pre-fill its size 14.

The weak point isn't the image editor at all. It's the road new code arrives by: an updater that, on Linux, has nothing but TLS between a network attacker and an install, built by a release pipeline that follows a mutable shared workflow receiving the configured Apple and Windows signing credentials 219. Score: 3.8 of 10, where 0.0 is benign and 10.0 is dangerous 4.

Four questions, each with its own failure mode:

Backdoors: any way for someone other than the user to make the program do something, such as a listener reachable from the network, hidden commands, or shells 4.

Phone-home: every outbound connection, when it happens, and what it carries 4.

Data and personal-information leakage: what leaves the process, including image metadata, the clipboard, crash data and identifiers 4.

Onerous or criminal legal terms: licenses, terms of service, privacy policies, end-user license agreements and contributor agreements 14.

The constraint was absolute: nothing downloaded was executed on the audit machine, including PhotoCraft, its build scripts, and third-party analysis tools 4. Everything below is reading. The tools and services used are listed, with links, after the Limits section.

Acquisition. We downloaded the v0.17.0 Linux aarch64 and x86_64 tarballs and the Windows x64 portable zip. All three matched both the release's SHA256SUMS.txt and GitHub's own per-file digests 34. Archives were unpacked with path-traversal protection, and the executable bit was stripped from every extracted file 4. The binaries' hashes were unknown to CIRCL hashlookup and RevEng.AI 4.

Binary reading. We ran strings, readelf section and segment tables, and the dynamic import table on all four Linux executables (the GUI and the CLI, for each architecture) 4. No segment is both writable and executable. Each entry point lies in .text. The GUI links only libc, libm, libgcc and the loader 4.

The Piano Roll

Crate accounting. Rust binaries retain the source paths of panic locations that survive compilation and inlining, but compiler settings can exclude this information and a crate with no surviving panic sites leaves none. We extracted those paths and compared the crates they name with Cargo.lock. The GUI evidences 204 registry crates (aarch64) and 203 (x86_64), the CLI 109 and 108. None is absent from the lockfile, and the only git checkouts in the Linux binaries are craft-libs at 92d392c, egui at 6d518fc and winit at a517b38, all pinned (Cargo.lock also pins a fourth git checkout, winprint.rs at 5f80b9b, for Windows) 4. A match is evidence of consistency, not completeness: vendored, generated or macro-expanded code need not leave a registry path.

Source reading at the tagged commit of PhotoCraft and its craft-libs dependency: every network call, listener, process launch, clipboard read, metadata path and preference default 12. Two dependencies on the TLS path, rustls-platform-verifier 0.7.1 and rustls- native-certs 0.8.4, were read from their crates.io packages, whose checksums match the lockfile 24.

Fork diffs. PhotoCraft builds against the project's own forks of egui and winit. We diffed each against its upstream base: egui is 90 commits ahead (about 23,200 added non-test lines in 90 files) and winit 37 commits ahead of v0.30.13 (about 16,100 added non-test lines in 54 files) 16. A pattern scan of the added lines found no direct network, process, environment-variable or file-writing calls, and the only new runtime dependency is unicode-bidi 416. A wrapper or macro that reaches those operations indirectly would not match the scan.

Advisories. We checked all 827 crates.io packages in the lockfile against OSV.dev 15. Nine have advisories: two vulnerabilities in the webpki family, and seven "unmaintained" notices4.

Legal and web. We read the license files and the brand license, searched the app for any consent or EULA text, and captured the project's site and a look-alike site, honoring robots.txt and sending an identifying User-Agent 1418.

Prior work in the issue tracker, read before claiming anything as new 1011121314.

Not Sylvia Plath's Bell Jar

Listeners. The control server binds 127.0.0.1, requires a token within a deadline, limits connections, and starts only with the control option 1. The single-instance channel is a Unix socket or loopback port with a random token kept in a per-user file, created with mode 0600 on Unix 1. The MCP server uses stdio transport only, with file access scoped through cap-std 1. The CLI's bridge client refuses any address that is not loopback 1.

The inside door. These bounds keep out other machines and other users. They don't keep out a malicious program already running as you: it can read the single-instance token in instance.json and ask the running editor to open files; when the control server is on, it can take that token from its token file or the launch output and drive the editor; and the stdio MCP server serves whichever process started it 1. For a desktop application that is the ordinary ceiling, since such a program could read your files directly. "Nothing covert" is a claim about PhotoCraft, not a sandbox around it.

Outbound. The only client is the updater. It calls api.github.com and github.com once per launch when general.automatically_check_updates is on, which it is by default; a manual check makes the same requests 12. The User-Agent string PhotoCraft/Update appears in both the source and the shipped binary 14.

No telemetry. No analytics, consent or crash-upload code exists in the app's source; the crash guard logs panics and invokes the previous panic hook, and it contains no upload call1.

Personal data. Save for Web defaults to copyright-only metadata, dropping camera EXIF and GPS. An ordinary save keeps the image's metadata, as Photoshop does 1. Face detection runs locally 1. The clipboard is read only on paste, Paste in Place, New from Clipboard, and when the New Document dialog opens to pre-fill its size 1.

Printing library. The project's winprint fork depends on an HTTP client and sigstore verification. Both are used only by its build script, which downloads PDFium when a feature is on and checks the download's sigstore attestation. PhotoCraft turns that feature off, and the Windows release contains no PDFium 2417.

Process launches include system utilities and update-installation and restart helpers. The updater launches a shell for Unix restart handling, which waits for the old process to exit and then starts the new one, and a host-side shell for Flatpak restarts; these are production paths, and benign 12.

Legal. The license is MIT OR Apache-2.0, with no contributor agreement. The brand license is a conventional trademark policy 1. We found no separate terms of service, privacy policy or EULA in the material inspected; the software, bundled assets and brand marks remain subject to their respective license conditions 14.

Clean room. The project says it was implemented "from public specs and observed behaviour only" 1. We did not test for copied Adobe code, which was outside our four questions, and found no evidence of any. We did not assess provenance or inspect development records, so we cannot substantiate the claim. With nothing pointing the other way, the author's judgment is that a clean-room implementation is more likely than not. That is a judgment, not a finding 423.

The chain has four links, each confirmed by reading, not by running:

The library. Both Linux GUI binaries embed rustls-webpki 0.103.15 source paths 4. RUSTSEC-2026-0382 says affected versions "may accept certificate paths containing distrusted emSign intermediate public keys", whose private keys "are now well known"; 0.103.16 rejects them 5. RustSec lists CVE-2026-111943 as this advisory's alias 5; the CVE record itself, issued by Go, describes only crypto/x509 6. Mozilla's CA Program tracks the compromise as bug 2083449 25.

The Chute

The trust store. The updater's HTTP client is configured with RootCerts::PlatformVerifier (craft-libs crates/update/src/http.rs, line 69) 2. On Linux, rustls-platform-verifier 0.7.1 loads roots with rustls_native_certs::load_native_certs() and verifies through rustls's WebPkiServerVerifier, which is rustls-webpki (src/verification/others.rs, lines 92 and 121) 24. Those roots come from the system bundle, /etc/ssl/certs/ca-certificates.crt and its equivalents, unless SSL_CERT_FILE or SSL_CERT_DIR points elsewhere 24. The disclosure lists eight compromised intermediates, six for TLS and two for code signing. Each has a Sectigo cross-sign chaining to AAA Certificate Services, and the TLS ones also chain through emSign Root TLS CA - G3, which emSign ECC Root CA - G3 cross-signs 7. Their holder "could impersonate any website or service" 7.

The integrity check. On Linux, the updater compares the download against the SHA-256 from GitHub's asset digest or the release's own SHA256SUMS.txt, both delivered over the same TLS channel. There is no signature check 2. macOS verifies the release team's code signature and Windows checks Authenticode 2. FreeBSD has no self-update path at all 2.

The trigger. The check runs at every launch by default; a click starts the update flow 12. Package installs (deb, rpm, pacman) then ask for the user's password through polkit; the standalone tarball and AppImage do not 2. Flatpak self-update is limited to per-user bundle installations 2.

The Portraits

Whether the second link holds depends on the machine. Ubuntu 24.04 removed the Comodo AAA root in ca-certificates 20260601~24.04.1 in June, and removed emSign ECC Root CA - G3 in 20260816ubuntu0.24.04.1 (USN-8944-1, 20 October) 89. An up-to-date Ubuntu 24.04 trusts neither. And there it is. The audit machine trusted both 4:

Measured on the audit host, 30 OctoberValue
ca-certificates package20240203, as installed in August 2025; never upgraded since
apt components configuredrestricted, universe, multiverse; main dropped on 19 October
AAA Certificate Services in bundle, SHA-256D7A7A0FB 5D7E2731 D771E948 4EBCDEF7 1D5F0C3E 0A294878 2BC83EE0 EA699EF4
emSign ECC Root CA - G3 in bundle, SHA-25686A1ECBA 089C4A8D 3BBE2734 C612BA34 1D813E04 3CF9E8A8 62CD5C57 A36BBE6B

The lag has two causes, and the missing component is only the second. Ubuntu shipped the AAA removal in June, while main was still configured, and no upgrade ran on this machine between then and 19 October. That day its apt sources were rewritten without main, so the upgrade it did run on 27 October could see neither fix 4. Presence in the bundle is what we measured; that a forged chain would be accepted from it is the untested hypothesis below. One host is an instance, not a rate 4.

The audit machine has since been fixed. On 31 October main was restored to its apt sources and ca-certificates upgraded to 20260816ubuntu0.24.04.1; neither root is in its trust store now 4. The table above records the machine as audited on 30 October.

The library fix closes the chain whatever the trust store holds. On 30 October the project's main branch still pinned 0.103.15, with the bump open as PR #10237 14. PhotoCraft 0.18.0 was published at 04:02 UTC on 31 October, the day this essay was published. Its Cargo.lock still pins rustls-webpki 0.103.15 and rustls-platform-verifier 0.7.1 26. We have not examined its binaries, so we are saying so plainly: we got it too late to audit, nothing we can see of it departs from the contours of this analysis, and we have no reason to believe any conclusion here has changed. PhotoCraft is on the list of projects we track, and if a later look changes anything, it will be published.

Release pipeline. PhotoCraft's release workflow delegates to storytold/craft-common-actions/.github/workflows/release.yml@main and passes it the Apple notarization and Windows code-signing secrets 119. Third-party actions in that workflow are pinned to commit SHAs, which is the advice from issue #1372, but eleven of the project's own actions follow @main1119. The shared workflow took ten commits from seven authors and bots between 22 and 28 October 19. The workflow produces no build provenance or attestation, and the v0.17.0 tag commit is unsigned 419. This is an architectural weakness, not a demonstrated compromise: whether an unreviewed change can reach that branch, and whether the secrets sit behind protected environments, depends on repository settings we could not see 19.

License texts. Release packages omit license texts that bundled assets require: the OFL texts for Inter and JetBrains Mono, and the licenses for the Lucide icons, the SCOWL word list and the libfacedetection model, which is BSD-3-Clause. The Windows zip ships fewer still 14. These are upstream attribution obligations and a packaging-compliance concern; users who redistribute copies may also need to preserve the required notices.

Ticket bot. The project's Discord-to-GitHub relay publishes reporters' Discord user IDs, and server and channel IDs, in public issues 13.

Look-alike site. photocraft.one is not linked from the project. It was registered on 7 October, with the registrant redacted 18. Its privacy page is unedited starter-template copy. It loads Yandex Metrica, and its "App" page embeds miniPaint, a different editor 18. Its download links do point to the official releases 18. We could not establish an affiliation with the PhotoCraft project and do not score this site's behavior against it.

Ours, caught and logged 4:

The Scarecrow

A lockfile parser flagged zvariant_utils as undeclared. Trailing [[patch.unused]] blocks had overwritten the last package entry.

We wrote off two /bin/sh launches as test code. One is; the other is the updater's production restart helper, which waits for the old process to exit and then starts the new one 2.

We scored the CLI bridge for sending its token over plain TCP "to any host:port". Its constructor refuses any address that is not loopback 1. The finding was dismissed and the score recomputed; it stayed at 3.8.

Two sections flagged as "unexpected" (.relro_padding, .tm_clone_table ) are standard linker output.

About sixty odd "hosts" in strings were fragments of a compression dictionary.

A search-engine summary asserted a "copyright fight from the original author". The page it seemed to come from says no such thing.

We first labeled the rustls-webpki flaw only CVE-2026-111943, then over-corrected and called that CVE Go's alone. RustSec lists it as the advisory's alias 5, while the CVE record names only Go's crypto/x509 6. We now cite RUSTSEC-2026-0382 first.

Others':

The Open Shed

A careful public audit, #8616, called the webpki advisory "build-time only" on 22 October. That was true at its commit. v0.16.0 added an HTTP client to the app three days later, and on 28 October a commenter, jm117fr, showed the runtime path in the signed Windows build10.

During our own review, one reviewer dated the AAA root's removal to the October notice. The notice removes emSign only; AAA went in June 89.

Another reviewer held that the two code-signing intermediates have no AAA cross-sign. The disclosure's own inventory lists one for each of the eight 7.

Function-level decompilation of the TLS and bind call sites. Our evidence is source plus embedded paths and imports, not disassembly. The decompilation service we tried caps uploads at 5 MB; the four Linux binaries are 88 to 135 MB 4.

Certificate acceptance. Whether rustls-webpki 0.103.15 with rustls-platform-verifier 0.7.1 accepts a chain through a compromised intermediate from a bundle like the audit host's needs an isolated test fixture, run off this machine. Whether the updater then reaches its install prompt on a matching forged checksum needs a second, mocked test.

The Hatch

macOS and Windows verifier behavior was not assessed beyond source 2.

Prevalence. How many Linux machines still trust either root is unknown 4.

Seven unmaintained dependencies are a maintenance risk, not a vulnerability 15.

Each weakness is typed (CWE) and given a severity: CVSS v4.0 with threat metrics for vulnerabilities, author-assigned for practice and legal findings 2122. A finding contributes 4 × (severity / 10)² × confidence points, where confidence is 1.0 for confirmed, 0.5 for plausible and 0.25 for speculative. Every scored finding here is confirmed. Each weakness counts once, at its worst current instance, and each unresolved question adds 0.1 or 0.3. The score is the sum, capped at 10.0. Because the sum alone would let one catastrophic flaw score only 4.0, the rubric sets floors: a confirmed backdoor (CWE-506 or CWE-912) scores at least 9.0, a confirmed CVSS 9.0 or higher at least 6.0, and any unresolved question at least 0.1 21.

FindingBasisSeverityPointsSpecies
Linux update channel (CWE-295: RUSTSEC-2026-0382 + lagging store + same-channel hash)CVSS-BT6.61.74II
Release pipeline on a mutable shared workflow with signing secrets (CWE-829)CVSS-BT5.61.25III
No function-level binary-to- source correspondenceambiguity—0.30—
Ticket bot publishes Discord IDspractice2.00.16II
Bind addresses unconfirmed at binary level; unmaintained deps; macOS/Windows unassessedambiguity—0.30—
Default-on update check; missing license textspractice / legal1.0 / 1.00.08I

Total 3.84 III

The Scale

The total, 3.84, rounds to 3.8, and the worst species is III. The two vectors are:

The score rates the release as shipped, not a particular machine, so CVSS environmental metrics are left out. On an up-to-date Ubuntu 24.04 the update-channel finding does not apply at all; the score is for the machines where it does, which AT:P (attack requirements present) records.

Species, borrowed from No. 02, grades reach, not likelihood: how far an ordinary act inside someone's role can travel through the system it sits in. I is the actor, II the town, III the country, IV the world 20. The update channel reaches the Linux users on lagging machines, so it is II. The worst here is a single merge to a shared workflow, which reaches the next signed release of every app built from it, on every platform, so it is III 1920.

The rubric changed twice during this audit, and both changes are disclosed 21:

RubricChangeDirectionScore
v0.1base CVSS, no deduplication10 = safe1.5 (8.5 on today's scale)
v0.2each weakness once, exploit maturity added, after seeing v0.1's result10 = safe6.2
v0.3direction corrected by the author0 = benign, 10 = dangerous3.8

All five scoring runs are kept in the evidence record. The ledger head recorded with the current score is ca0cc0535867a28f5478affcea19a37068a0c29a95f098d9208a5a12a59e8e314. Rubric v0.3 will score the next audit unchanged, or any change will be published before that audit is scored.

Label: Mostly Harmless.

  1. Claim: PhotoCraft 0.17.0's Linux updater verifies TLS through rustls-webpki 0.103.15. Falsifier: disassembly showing the update client's certificate verification does not reach that crate 2424.
  2. Hypothesis, not execution-tested: PhotoCraft 0.17.0's Linux verifier may accept an otherwise valid api.github.com certificate chain through a compromised intermediate when its active trust store contains a suitable trust anchor and no applicable distrust mechanism rejects the chain. Falsifier: a test harness, run off-host, in which rustls- webpki 0.103.15 with rustls-platform-verifier 0.7.1 rejects such a chain 57.
  3. Claim: every registry crate and version identified in the recovered Linux binary source paths appears in Cargo.lock; this does not establish a complete inventory of compiled- in code. Falsifier: any embedded registry source path naming a crate and version not in the lockfile 4.

download off the vulnerable verifier; since the checksums come from the same release, it shows the file is the one GitHub serves, not who published it. Check that ca- certificates is current (on Ubuntu 24.04, apt policy ca-certificates ) and that your apt sources still include main 138.

The engineer asks whether a network attacker can get code onto a machine through this app. The executive asks who could ship a signed PhotoCraft release nobody intended. One artifact answers both: a release whose signature is checked on every platform, built from pinned workflows, with provenance anyone can verify. Linux has neither the signature check nor the provenance today 219.

Analysis, run locally (the standard library and system tools only; nothing downloaded was run):

The Threads

Services and data sources queried:

Projects examined:

Writing and review:

ClaimFootnote(s)Source typeStatus
Release assets matched SHA256SUMS.txt and GitHub digests[3][4]PrimaryEstablished
Every registry crate recovered from the Linux binaries' source paths is in Cargo.lock[4]PrimaryEstablished (consistency, not completeness)
Listeners are loopback/ Unix-socket and token- protected; MCP is stdio; the bridge refuses non- loopback addresses[1]PrimaryEstablished
A malicious same-user process can use the local tokens: open files via the single-instance channel, and drive the editor when the control server is on[1]PrimaryEstablished (source)
Update requests go to api.github.com and github.com, plus GitHub's githubusercontent.com redirect hosts and any configured proxy[1][2][4]PrimaryEstablished (static; not observed on the wire)
Update check on by default, once per launch, can be disabled; manual checks remain[1]PrimaryEstablished
No telemetry, analytics or crash upload in source[1]PrimaryEstablished (static)
A pattern scan of the fork diffs found no direct network, process, env or file-write calls[4][16]PrimaryEstablished (scan scope only)
Linux GUI ships rustls- webpki 0.103.15[4]PrimaryEstablished
The Linux updater's certificate verification runs through rustls-platform- verifier into rustls-webpki[2][24]PrimaryEstablished (source)
RUSTSEC-2026-0382 affects 0.103.15, fixed in 0.103.16[5]PrimaryEstablished
CVE-2026-111943 was issued by Go for crypto/ x509; RustSec lists it as an alias of RUSTSEC-2026-0382[5][6]PrimaryEstablished
All eight compromised intermediates (six TLS, two code-signing) have Sectigo cross-signs chaining to AAA Certificate Services[7]PrimaryEstablished
Linux updates verified by same-channel SHA-256 only; macOS team signature; Windows Authenticode; no FreeBSD self-update[2]PrimaryEstablished (source)
Ubuntu 24.04 removed AAA in June and emSign ECC G3 on 2026-10-20[8][9]PrimaryEstablished
Audit host trusted both anchors: never upgraded ca-certificates, and main dropped from its apt sources on 19 October[4]Primary (measurement, apt and dpkg logs)Established for one host (as of 30 October; fixed 31 October)
Prevalence of lagging trust stores[4]UnknownUnknown
Forged update installs on a lagging host after the user accepts it (and, for package installs, enters a password)[2][5][7]PrimaryHypothesis (not executed)
Release workflow follows @main with signing secrets; no provenance[1][19]PrimaryEstablished
An unauthorized change can reach that workflow[19]UnknownUnverified (repository settings not visible)
Release packages omit required license texts[1][4]PrimaryEstablished
Ticket bot publishes Discord IDs[13]PrimaryEstablished
photocraft.one is not linked from the project, uses template privacy copy, embeds miniPaint[18]PrimaryEstablished
photocraft.one's operator[18]UnknownUnverified (no affiliation established)
0.18.0 still pins rustls- webpki 0.103.15 in its lockfile[26]PrimaryEstablished (lockfile; binaries not examined)
Clean-room more likely than not[1][4][23]SecondaryBest Educated Guess (author judgment; provenance not assessed)
Hawthorne 3.8, Species III, rubric v0.3[4][21]PrimaryAuthor assessment; vectors and inputs published in section 9

References

  1. 01storytold/photocraft at v0.17.0. GitHub. https://github.com/storytold/photocraft/tree/v0.17.0 (files cited: README.md, Cargo.toml, crates/engine/src/prefs.rs, crates/ui-egui/src/updates_ui.rs, apps/ photocraft/src/updates.rs, apps/photocraft/src/control_server.rs, apps/photocraft/src/single_instance.rs, crates/automation/Cargo.toml, crates/automation/src/bridge.rs, crates/automation/src/rpc.rs, crates/ engine/src/cmd/plugin_cmds.rs, crates/engine/src/cmd/web_cmds/settings.rs, crates/ui-egui/src/app/ clipboard.rs, apps/photocraft/src/crash_guard.rs, NOTICE, docs/brand/LICENSE-brand.txt, .github/ workflows/release.yml) (accessed 2026-10-30).
  2. 02storytold/craft-libs at 92d392cff132eaf53e13afff77f38b5c11b73aa0. GitHub. https://github.com/storytold/craft-libs/tree/92d392cff132eaf53e13afff77f38b5c11b73aa0 (crates/update/src: http.rs, source.rs, release.rs, install.rs, self_update.rs, updater.rs; crates/update/Cargo.toml) (accessed 2026-10-30).
  3. 03PhotoCraft v0.17.0 release and SHA256SUMS.txt. GitHub, 2026-10-28. https://github.com/storytold/photocraft/releases/tag/v0.17.0 (accessed 2026-10-30).
  4. 04This audit's evidence record: hash-chained ledger, artifact hashes, measurements, findings and scores (reveng audit database, 2026-10-30/31). Unpublished; available on request. Ledger head at the current score: ca0cc0535867a28f5478affcea19a37068a0c29a95f098d9208a5a12a59e8e31.
  5. 05RustSec. RUSTSEC-2026-0382: rustls-webpki, certificate verification may accept distrusted intermediates. 2026-10-20. https://rustsec.org/advisories/RUSTSEC-2026-0382.html (accessed 2026-10-30).
  6. 06CVE-2026-111943: Distrust compromised intermediate certificates in crypto/x509 (assigner: Go). 2026-10-21. https://www.cve.org/CVERecord?id=CVE-2026-111943 (accessed 2026-10-30).
  7. 07eMudhra intermediate compromise disclosure, with impacted-intermediates.json and roots.json. https://emudhra.we-have-a-problem.com/ (accessed 2026-10-30).
  8. 08Ubuntu. ca-certificates changelog (noble), entries 20260816ubuntu0.24.04.1 and 20260601~24.04.1. https://changelogs.ubuntu.com/changelogs/pool/main/c/ca-certificates/ca-certificates_20260816ubuntu0.24.04.1/changelog (accessed 2026-10-30).
  9. 09Ubuntu Security Notice USN-8944-1: ca-certificates update. 2026-10-20. https://lists.ubuntu.com/archives/ubuntu-security-announce/2026-October/011428.html (accessed 2026-10-30).
  10. 10storytold/photocraft issue #8616, and comment by jm117fr, 2026-10-28. https://github.com/storytold/photocraft/issues/8616 (accessed 2026-10-30).
  11. 11storytold/photocraft issue #1372, "Security checkup of the project". 2026-10-08. https://github.com/storytold/photocraft/issues/1372 (accessed 2026-10-30).
  12. 12storytold/photocraft issue #9361. 2026-10-25. https://github.com/storytold/photocraft/issues/9361 (accessed 2026-10-30).
  13. 13storytold/photocraft issue #8557, "Codex does not recommend installing". 2026-10-22. https://github.com/storytold/photocraft/issues/8557 (accessed 2026-10-30).
  14. 14storytold/photocraft pull request #10237. 2026-10-30. https://github.com/storytold/photocraft/pull/10237 (accessed 2026-10-31; still open).
  15. 15OSV.dev batch query of the 827 crates.io packages in Cargo.lock v0.17.0. https://api.osv.dev/v1/querybatch (queried 2026-10-30; results in ).
  16. 16Fork comparisons: storytold/egui 6d518fc vs emilk/egui eee824c0; storytold/winit a517b38 vs rust- windowing/winit v0.30.13. https://github.com/storytold/egui , https://github.com/storytold/winit (accessed 2026-10-30).
  17. 17storytold/winprint.rs at 5f80b9b, build.rs. https://github.com/storytold/winprint.rs/blob/5f80b9baf6b58937c401656634e42d33f00ddf49/build.rs (accessed 2026-10-30).
  18. 18photocraft.one: captures of /, /app/ and /privacy, and RDAP record from rdap.nic.one, 2026-10-30. https://photocraft.one/ (captures in ).
  19. 19storytold/craft-common-actions, .github/workflows/release.yml and its commit history (main, 2026-10-30). https://github.com/storytold/craft-common-actions (accessed 2026-10-30).
  20. 20Pickett, J. "Agents and the Agency of Pause", hwtn.io No. 02, section 05 "Species". https://hwtn.io/essays/no02
  21. 21Hawthorne scoring rubric v0.3, 2026-10-30, with changelog (in ).
  22. 22FIRST. CVSS v4.0 specification and reference calculator. https://www.first.org/cvss/v4.0/specification-document · https://github.com/FIRSTdotorg/cvss-v4-calculator (accessed 2026-10-30).
  23. 23storytold/artcraft issue #2016, "You are asking for lawsuits". 2026-10-09. https://github.com/storytold/artcraft/issues/2016 (accessed 2026-10-30).
  24. 24rustls-platform-verifier 0.7.1 (src/verification/mod.rs, src/verification/others.rs) and rustls-native- certs 0.8.4 (src/lib.rs), crates.io packages, checksums matching Cargo.lock v0.17.0. https://crates.io/crates/rustls-platform-verifier/0.7.1 · https://crates.io/crates/rustls-native-certs/0.8.4 (accessed 2026-10-31).
  25. 25Mozilla Bugzilla bug 2083449, "eMudhra: Private key compromise of Intermediate Certificates", CA Program, opened 2026-10-18. https://bugzilla.mozilla.org/show_bug.cgi?id=2083449 (accessed 2026-10-31).
  26. 26PhotoCraft v0.18.0 release, 2026-10-31, and its Cargo.lock. https://github.com/storytold/photocraft/releases/tag/v0.18.0 · https://github.com/storytold/photocraft/blob/v0.18.0/Cargo.lock (accessed 2026-10-31).