Executive brief
OpenSourcePOS is a point-of-sale system used in retail and hospitality to manage sales, inventory, and employee access. The login endpoint lacks rate limiting and account lockout mechanisms, allowing attackers to conduct unlimited credential-guessing attacks against employee accounts. When reCAPTCHA is enabled (not default), the CAPTCHA validation occurs after password verification, creating a security flaw where incorrect passwords never trigger CAPTCHA protection and error messages leak whether a username exists—enabling attackers to enumerate valid credentials without solving any challenge.
Technical details
The vulnerability is classified as CWE-307 (Improper Restriction of Excessive Authentication Attempts). The Login::index() controller in app/Controllers/Login.php applies only a single custom validation rule (login_check) to submitted credentials with no failed-attempt counter, temporary/permanent account lockout, or per-IP rate limiting. The /login endpoint is excluded from CSRF protection by default (app/Config/Filters.php), allowing unauthenticated credential-guessing POST requests. Google reCAPTCHA is the only optional mitigation but is disabled by default. When reCAPTCHA is enabled, the password is verified before CAPTCHA validation occurs (app/Models/Employee.php::login()), so incorrect passwords never consume a CAPTCHA token. Additionally, distinct error responses ('invalid_username_and_password' vs 'invalid_gcaptcha') create an oracle allowing attackers to determine the correct password by observing which error is returned. Patches have been committed to fix these issues.
Affected products
- opensourcepos Open Source Point of Sale up to 3.4.2
Timeline
- 2026-08-15: disclosed
- 2026-07-12: patched: Fix committed in fork purnadika/opensourcepos at 851fc32