Documentation : https://docs.bunkerweb.io/1.6.12~rc1/
Docker tags :
- All-in-one :
bunkerity/bunkerweb-all-in-one:1.6.12-rc1orghcr.io/bunkerity/bunkerweb-all-in-one:1.6.12-rc1 - BunkerWeb :
bunkerity/bunkerweb:1.6.12-rc1orghcr.io/bunkerity/bunkerweb:1.6.12-rc1 - Scheduler :
bunkerity/bunkerweb-scheduler:1.6.12-rc1orghcr.io/bunkerity/bunkerweb-scheduler:1.6.12-rc1 - Autoconf :
bunkerity/bunkerweb-autoconf:1.6.12-rc1orghcr.io/bunkerity/bunkerweb-autoconf:1.6.12-rc1 - UI :
bunkerity/bunkerweb-ui:1.6.12-rc1orghcr.io/bunkerity/bunkerweb-ui:1.6.12-rc1 - API :
bunkerity/bunkerweb-api:1.6.12-rc1orghcr.io/bunkerity/bunkerweb-api:1.6.12-rc1
Linux packages : https://packagecloud.io/app/bunkerity/bunkerweb/search?q=1.6.12~rc1&filter=all&dist=
Changelog :
- [SECURITY]
antibot: Cap.jsscript-srcnow uses a strict per-request nonce (no more'unsafe-inline'); every challenge response also sendsCache-Control: no-store. Requires Cap.js widget0.1.48+. - [SECURITY]
letsencrypt(UI): harden delete + new heal flow — per-request scratch dir,fcntl.flock,./..rejected incert_name, DOMPurify +markupsafe.escapeat every HTML sink, 500 on persistence failure; new/letsencrypt/{orphans,accounts,cache-status,heal}endpoints, per-row Heal button, sidebar orphan toast. - [SECURITY]
linux:after-removehooks now preserve/var/log/bunkerweb,/etc/bunkerweb,/var/lib/bunkerweband the upgrade backups on plain uninstall (only purge wipes configs + DB; logs and backups always kept, disposal commands printed). Upgrade backups moved from/var/tmpto/var/backups/bunkerwebbecausesystemd-tmpfilesreaps/var/tmpafter 30 days (silently losing the backup — including the SQLite DB — on a delayed reinstall);postinstallrestores from the new path and falls back to the legacy/var/tmplocation. Backups are still written viainstall -m 0600 -o root -g root(atomic) and pre-existing world-readable ones are retro-tightened. Also removed the unreachable RPMpurge)scriptlet arm (rpm only ever passes0/1). - [SECURITY]
api: theAPI_ACL_BOOTSTRAP_FILEloader now validates a suppliedpassword_hash/password_bcrypt— it must be a real bcrypt hash meeting the minimum cost (10); a weak or malformed hash is ignored and a secure random password is generated instead of being stored verbatim (which let a controlled ACL file install a near-plaintext admin credential). - [SECURITY]
ui: extend the CSV/XLSX formula-injection escaping (CWE-1236) to the\t(tab) and\r(carriage-return) leaders thatdefusedcsvomits — server-sidecsv_safe/csv_writerand the client-sidebwCsvSafehook now prefix those cells with'as well. - [BUGFIX]
letsencrypt(core): fix self-propagating cache poisoning that caused fleet-widecertbot AccountNotFound; add CA-agnostic consistency gate (LE + ZeroSSL paths), server-scopedselect_account_id, auto-purge + re-register when the ACME server reports a pinned--accountas deleted (stale-account JWS recovery), redacted-valueConfiguratorWARN logs. - [BUGFIX]
letsencrypt: close the scheduler↔UI cache-row write race —certbot-renew/certbot-newand the UI heal/delete flow now serialize on one sharedfcntl.flock(/var/cache/bunkerweb/letsencrypt/.cache-write.lock) instead of a UI-only lock, so a renew no longer silently overwrites a concurrent heal (or vice-versa). - [BUGFIX]
letsencrypt: route53 certificates issued with explicit AWS access keys now auto-renew — the renew job re-derives the credentials and setsAWS_CONFIG_FILE(whichcertbot-dns-route53requires but the blanketcertbot renewnever set). Other DNS providers unaffected. - [FEATURE]
scheduler: newSCHEDULER_MAX_WORKERSenv var caps the job-executor thread pool to bound DB-pool pressure on shared MariaDB/MySQL/PostgreSQL; auto default tightened frommin(8, cpu*4)tomin(8, max(2, cpu*2))and a warning is emitted when the resolved value exceedsDATABASE_POOL_SIZE+DATABASE_POOL_MAX_OVERFLOW. - [FEATURE]
ui:ADMIN_PASSWORDnow also accepts a pre-hashed bcrypt value ($2a$/$2b$/$2y$), stored as-is so the plaintext never lands in env files or secrets (env create +OVERRIDE_ADMIN_CREDSpaths only; wizard and profile still take plaintext). The strength policy is skipped for a hash, but a cost factor below10is rejected and10–11logs a warning. - [BUGFIX]
installer:misc/install-bunkerweb.shis now idempotent on re-runs of a testing/dev install — theforce-bad-versiondirective is appended to/etc/dpkg/dpkg.cfgonly when the exact line is absent, so repeated runs no longer duplicate it. The Docker deployment path also warns when the resolved image tag isdev, which has no published Docker Hub image and would otherwise yield a compose stack that fails to pull. - [BUGFIX]
ci: the install script published to the Testing GitHub release now has itsDEFAULT_BUNKERWEB_VERSIONpinned totesting(rewritten before checksum generation, gated on an exactly-one-declaration check), so downloading it from the Testing release defaults to the testing channel instead of the hardcoded stable version. - [BUGFIX]
ui: the Setup Wizard now shows a Log Out button when reached while already authenticated (admin created viaADMIN_PASSWORDbut no UI service configured yet), so the user is no longer stranded on the wizard with no way to end their session. - [BUGFIX]
limit: fix spurious429over HTTP/3 — HTTP/3 streams were counted in the lowLIMIT_CONN_MAX_HTTP1zone because its key was keyed on$http2alone (empty for HTTP/3 too). Now keyed on"$http2$http3", so each protocol counts against its own limit. - [BUGFIX]
ui: cut/home,/reportsand/bansload time from seconds to sub-second on Redis-backed setups by pipelining the Python Redis layer — batchedLRANGE,SCAN+MGETinstead of blockingKEYS, pipelined facet/metric reads, and per-requestflask.gclient caching — plus a 30s single-flight cache on home aggregates. The single-flight lock is bypassed when Redis is down, so the degraded instance-API fallback no longer serializes/homeper worker during an outage. - [BUGFIX]
ui: static assets (~70% of UI requests) no longer run the full per-request lifecycle —before_requestnow early-exits for/css/ /img/ /js/ /json/ /fonts/ /libs/ /locales/before the cross-processUIDatafile lock, the CSP nonce, and theget_metadata/get_configDB fan-out. Cuts ~14 DBSELECTs per static request to zero and static latency ~7× (56→8 ms p50); CSP headers (after-request nonce fallback), auth, and dynamic pages are unchanged. - [BUGFIX]
customcert: drop the 24-hour expiry check — expired or soon-to-expire custom certificates are now accepted and served (operator owns cert lifecycle); the cert is still validated as a parseable X.509. - [BUGFIX]
database: scheduler now overrides existingmethod=ui/method=apirows so env vars stop being shadowed once a setting was touched in the UI. Stuck rows self-heal on next scheduler reload. Autoconf precedence unchanged; UI→scheduler direction still blocked. - [BUGFIX]
database:save_confignow supplements its prefix-match set with non-draft DB services, so multisite env settings for services created out-of-band (UI/API/autoconf) are no longer dropped as unknown globals. - [BUGFIX]
ui: form-builder no longer resubmits default-method values left untouched, so a no-op Save stops creating phantommethod=uirows. - [BUGFIX]
bunkernet(UI): replace binary "Inactive" with Connected / API unreachable / Not registered + live reason; instance ID masked with reveal toggle and redacted from messages; 5 s ping timeout, disk self-heal so a fresh registration goes Active without a reload. - [BUGFIX]
mtls: newMTLS_URL_nregex setting enforces mTLS per path instead of site-wide; setMTLS_VERIFY_CLIENT=optionaland the client certificate is checked in Lua only on matching URIs (invalid regex fails closed). - [LINUX] Updated NGINX version to v1.30.2 for Fedora 43 and 44 integration now that it is available in the repositories.
- [LINUX] Support Ubuntu 26.04 (Resolute Raccoon): the default
ubuntupackage target now builds on Ubuntu 26.04 against Python 3.14 (nginx = 1.30.2-1~resolute); the previous default 24.04 Noble moves to the newubuntu-nobleidentifier (packagecloud repoubuntu/noble), and 22.04 Jammy (ubuntu-jammy) is unchanged. - [BUGFIX]
ui/api: fix a possible login lockout under bcrypt 5.0.0, which raises aValueErrorinstead of truncating a secret over its 72-byte limit. Password verification now truncates the candidate to 72 bytes (matching how hashes are created), so accounts whose password exceeds 72 bytes — easy with multi-byte characters like accents or emoji — keep working. Setting an over-72-byte password is now rejected up front with a clear message and log across the Setup Wizard, profile page andADMIN_PASSWORD/API_PASSWORDenv vars (pre-hashed values exempt), and the set-password fields cap input at 72. - [BUGFIX]
ui: fix dark/light theme flicker and wrong-theme-on-load. The client no longer re-applies a stale per-browserlocalStoragevalue after paint, so the server-rendered profile theme is authoritative — no flash, and consistent across devices/browsers (theme now follows the logged-in profile; last toggle wins everywhere). Anonymous pages (login/setup) resolve their theme before first paint via a nonce'd head script honoring the last choice, then the OSprefers-color-scheme. - [BUGFIX]
ui: fix plugin metrics pages (Bad Behavior, Blacklist) crashing withcan only concatenate str (not "int") to stron Redis-backed setups —get_metricsaggregation now coerces a non-numeric Redis value instead of doingstr += int. (Fixes #3610) - [DEPS] Updated lua-resty-string version to v0.18
- [DEPS] Updated coreruleset-v4 version to v4.27.0