InvoicePlane v1.7.2 RC 1
| Hash Format | Hash |
|---|---|
| MD5 | 398d355d1bdfc5ca040386af781d6d8e |
| SHA-256 | 9ab69432acb07a9802d351fcfffc0bf061d5bb3e022d662bd63fa2006d5d6eaf |
Many thanks to @drewangell, @Jannomag, @mpldr, and @PatrickGTR for their contributions to this release.
Huge thanks to @0raN9ewww, @5ud0er, @akgul7990, @alanturing881, @ali-iltizar, @capt-bl4ck0ut, @chakrapani150, @Char0n1507, @Chittu13, @cyabell, @de3erve-hunter, @EvidentObscurity, @FelipeSilvany, @FORIMOC, @geo-chen, @HuajiHD, @iiihaiii, @kitu232, @lighthousekeeper1212, @mattmumford-git, @PLpaPLpa, @QiaoNPC, @radoi-teodor, @tikket1, @tonghuaroot, @udaypali, @venkatesh2003631, and @Vijay-raghav7 for responsibly disclosing these vulnerabilities. Without you, this release wouldn't have been possible.
New Contributors
Improvements / Changes
Security & Stability
Full details — severity, CVSS, and GHSA advisories — are tracked in the Security Vulnerability Summary in
.github/CHANGELOG.md.
- #1505 Remote code execution via the writable templates directory closed by replacing dynamic filesystem template discovery with a static allowlist and
ipconfig.php-based configuration; also closes five related open-redirect instances (GHSA-v735-2x3r-gwpp) - #1514 Password-reset tokens now expire, closing a broken-authentication window that previously allowed indefinite reuse (GHSA-5r28-6rw3-25c2)
- #1512 Arbitrary file deletion via path traversal in the invoice-logo setting closed with path-traversal guards, symlink protection, and attachment-name XSS prevention (also completed in #1510) (GHSA-65v2-4g37-rxjw, GHSA-45vj-9p52-f8mq)
- #1494 Password-reset tokens now use a cryptographically secure
random_bytes(32)generator instead of a predictablemd5(time())seed (GHSA-jfgr-778p-m943) - #1479 SQL/DDL injection via the tax-rate decimal-places setting hardened with transaction-wrapped validation and unit tests (also completed in #1488) (GHSA-x6rh-cr7q-5w7j, GHSA-34g5-4hfc-g983)
- #1513 Configuration injection in the database setup wizard blocked by rejecting newline characters in
db_hostnameand related fields (GHSA-ffq5-mw9f-mv6j) - #1471 Guest quote approve/reject and payment-gateway callbacks now enforce client scoping and require POST, closing a horizontal-privilege-escalation IDOR and a GET-based CSRF-equivalent vector reachable through email link prefetching (also completed in #1482, #1487) (GHSA-pjf5-c2m5-7m4x, GHSA-6xj3-274m-4mvg, GHSA-7r3g-fppx-2p79)
- #1517 Guest invoice/payment endpoints gained a
guest_visible()filter, closing an access-control bypass that exposed non-public invoices (also completed in #1537) (GHSA-f95x-25mh-wcxv) - #1491 Setup wizard locked after install (
SETUP_COMPLETED), with an admin security-warning system, closing unauthenticated re-entry into the installer (also completed in #1511, #1518) (GHSA-37pr-q48j-46gg, GHSA-2j6j-6f6q-57vq, GHSA-jx5h-6r8f-m2h3) - #1622 CSRF via GET-based logo removal closed by converting the settings logo-removal links to POST forms with CSRF-token validation (GHSA-qx8h-35wf-cgqf)
- #1559 Missing CSRF protection on invoice
delete()/delete_invoice_tax()closed by requiring POST and a valid CSRF token (also completed in #1561, #1624) (GHSA-mhvh-4j3w-7pvj) - #1555 Authentication bypass via MD5 magic-hash type juggling hardened on the legacy auth path (GHSA-x66r-7wf6-wgv7)
- #1621 Deactivated user accounts can no longer authenticate (GHSA-jw57-6692-jh2q)
- #1620 Sensitive SUMEX invoice XML disclosure closed by writing to a non-web-accessible
storage/temp/directory (GHSA-583r-4pw9-6rc9) - #1623 Sensitive import CSV disclosure closed by denying direct web access to
uploads/import/(GHSA-wv2c-c285-9hrq) - #1626 Authorization bypass through a user-controlled key (IDOR) closed with
can_user_access()/can_user_manage()object-level checks for clients, projects, invoices, and quotes (GHSA-h4xh-4jwc-485r) - #1545 Guest attachment access bypass closed — the guest
Getcontroller now enforces the same guest-visible status check as the guestViewcontroller (GHSA-phh5-3jc3-pm6w) - #1556 Sensitive financial data exposure via unauthenticated public invoice closed — the guest
Viewcontroller now extendsGuest_Controllerand enforces client-ownership scoping (GHSA-9hx6-6h6f-2wq3) - #1573 Authenticated and second-order SQL injection via the
custom_field_tableidentifier closed with a server-side allowlist and defense-in-depth sink guards (also completed in #1632) (GHSA-98vm-2r9v-mpgj, GHSA-vv4r-cgmw-w6x2) - #1630 SQL injection in the user/client name-search Ajax endpoint closed by replacing string-concatenated
LIKEclauses with parameterized query-builder calls (GHSA-g7f2-mj3r-xx88) - #1615 Arbitrary local file read via mPDF
file://in the Sales-by-Year report closed (GHSA-j89p-m59x-86r9) - #1547 Local file inclusion via the SUMEX PDF template parameter closed by validating the template name in
Sumex::pdf()and the guest SUMEX PDF actions before rendering (GHSA-wj6q-j965-2w2v) - #1616 Unauthenticated PayPal capture payment forgery closed by validating currency and amount against the invoice (GHSA-35qh-94hc-hm2w)
- #1492 SSRF via admin-stored PDF footer content closed by sanitizing content before mPDF rendering (GHSA-vgq9-469p-q7j3)
- #1515 Stripe/PayPal API credential exposure via HTML source closed (GHSA-8543-x4j8-jj4q)
- #1574 Stored XSS via CSV import (payment method name) closed (GHSA-vm87-2qmm-rhg8)
- #1516 Stored XSS in the Online Payment settings page (Stripe API key / PayPal client secret fields) closed with proper output escaping (GHSA-xvrc-hv8j-8v8w)
- #1557 Invoice PDF passwords encrypted at rest instead of stored in plaintext (GHSA-vphv-wmr3-68fp)
- #1496 Duplicate payment processing (Stripe callback replay) closed with a unique
payment_external_idindex (GHSA-6cpc-hr8h-xgr2) - #1486 Email-template preview XSS closed by rendering previews as sanitized/plain text instead of raw HTML (also completed in #1500, #1516, #1499) (GHSA-4wqv-84px-8jc6)
- #1635 Stored XSS via unescaped
client_emailin invoice/quote mailer views closed (GHSA-477r-xmgc-vcvj) - #1583 Non-constant-time
cron_keycomparison in the recurring-invoice cron endpoint fixed (GHSA-jg68-6mqc-hxcr) - #1507 Optional EXIF metadata stripping from uploads added (
SEC_STRIP_EXIF_FROM_IMAGES, off by default) (GHSA-7j67-2v6p-275v) - #1495 PHPMailer SMTP debug output no longer leaks into AJAX responses (internal audit finding)
- #1567 Session & infrastructure hardening:
cookie_httponly=true, defaultX-Frame-Options: SAMEORIGIN, session-fixation fix, password-reset log-injection sanitization, and aReferrer-Policyheader (internal audit findings) - #1640 Authentication checkpoint hardened with strict comparison for the
user_type/required_keysession check (GHSA-346c-gqqq-mrm2, by @Char0n1507) - #1639 Log injection via unsanitized
cron_keyinCron::recur()fixed (GHSA-g53q-v2pv-xr83, by @Char0n1507) - #1638 IDOR closed: the primary administrator's password can no longer be changed by another admin (GHSA-x38q-xhjj-jr8w, by @Char0n1507)
- #1637 CSRF token validation added to seven delete-style endpoints that relied only on a URL-substring check (GHSA-9372-vj68-hmc3, by @Char0n1507)
- #1636 CSRF bypass in
Recurring::stop()via GET request closed (GHSA-qf9q-2hxm-4wh9, by @Char0n1507) - #1536 Review follow-ups:
entrypoint.shconfig-injection guard, XSS trait ordering fix, logo URL escaping, custom-template allowlisting,Mdl_reportscast fix - #1558 Quote PDF passwords encrypted at rest
- #1560 Local file inclusion via the invoice XML-config identifier closed with strict allowlist validation before the config file is included (GHSA-9248-qccw-7x7j)
- #1589 Session ID regenerated on login to prevent session fixation
- #1604
csrf_meta/csrf_token_valuerefreshed on every XHR request (by @sudwebdesign) - #1605
CSRF_REGENERATEoption added toipconfig(by @sudwebdesign)
Other improvements
- #1288 Re-introduced Stripe & PayPal, adding PayPal Advanced Credit Cards and Venmo support (by @drewangell)
- #1376 QR-code size on invoices is now configurable
- #1466 Move the setup-php-composer composite action into
.github/actions/ - #1483 Batch settings save: reduce DB queries from ~70 to 3 (transaction-wrapped)
- #1490 Add a Laravel Pint code-style check
- #1503 Add database indexes on frequently queried columns
- #1509 Add the Docker application container (combined web server + PHP) (by @mpldr)
- #1529 Document the arbitrary file-deletion vulnerability for CVE allocation
- #1538 Add v1.7.2 PR/issue/security-advisory release table and security-improvements doc
- #1548 Implement recipient determination logic in QrCode.php (by @Jannomag)
- #1552 Remove orphaned docblock left after deduplication of
Settings::remove_logo() - #1572 Client birthdate field support
- #1603 Reorganize security documentation and update release notes for v1.7.2
- #1607
fullpage-loader: moveloader-error.svgintoloader-error-message(by @sudwebdesign) - #1618 Setup now fails loudly when a migration SQL file cannot be read
- #1627 Add
php -lpre-push requirement to CLAUDE.md - #1629 GitHub Action release build automation
- #1140 Remittance slip / QR-code remittance text
- #1449
quote_templates/publicshowing the client on both header and footer - #1451 QR-code generation for batch invoice processing
- #1465 Simplify redundant conditionals in email template tags
- #1180 Undefined-array-key error for mPDF footer names on PHP 8.3+
- #1478 Add the missing
attachment()method to the guestGetcontroller - #1575 Fix MariaDB 1066 duplicate join on guest Payments page
- #1576 Fix 7 pre-beta bugs found in security-hardening review
- #1617 Harden migration SQL runner against semicolons in strings/comments
- #1628 Misc fixes
Full Changelog: v1.7.1...v1.7.2-rc-1