Date
September 24, 2026
Typ
Audit

Independent source code analysis by secuvera

From September to November 2025, secuvera GmbH carried out a static source code analysis of heylogin. secuvera is a BSI-certified IT security service provider and an approved testing body for IT security.

The analysis identified three vulnerabilities of medium severity and two informational findings. No critical or high severity vulnerabilities were found. We remediated all three vulnerabilities and had them retested in September 2026.

The result of the retest: None of the vulnerabilities were still present in the reviewed source code. secuvera attests a very high security level to the source code, the highest rating in the assessment scheme used.

We are publishing the full report and describe below what each vulnerability meant and what we changed.

What exactly was tested

So that you can put the result in context, here is the scope in plain terms:

  • Method: Static source code analysis as a white-box test. The testers had full access to our source code. What was examined is therefore the code itself, not the running production environment.
  • Tools: Automated analysis with Coverity and Semgrep Code, followed by manual verification of all results. Additional manual testing was performed to identify weaknesses in the source code.
  • Scope: The entire monorepo with all applications. The highest priority was given to the backend, the client core and our crypto library, followed by the browser extension, the web client, container and infrastructure configuration, and finally the Android and iOS apps.
  • Standards applied: BSI penetration testing concept, OWASP Top 10 (2021), CVSS v4.0.
  • Retest: In early September 2026, all identified vulnerabilities were manually re-examined.

In the mapping against the OWASP Top 10, all ten categories were rated "Pass".

The three findings and what we changed

Hardcoded credentials (medium, CVSS 5.1)

What was found: Credentials for internal operational and development tools were stored directly in configuration files instead of being supplied through environment variables. An attacker needs access to the source code to see them at all, which secuvera took into account in the rating (metric "Privileges Required: High"). No keys that could decrypt customer data were among them, and architecturally there cannot be any: because of our zero-knowledge architecture, those keys exist only on your devices and never on our servers.

What we changed: All affected credentials were rotated, which makes the values previously contained in the code worthless. Production credentials are now injected into the respective environment at deployment time instead of being held in the repository. What remains there are credentials for local test and development environments only, which provide no access to production systems.

CORS misconfiguration (medium, CVSS 6.9)

What was found: The heylogin browser extension communicates with an overlay that we insert into the website you are visiting, for example to fill in credentials, using the browser function postMessage(). A wildcard was used instead of a specific target origin, so the messages reached a broader context than necessary and the surrounding website could in principle read them. According to the report, what was at stake was fingerprinting of the extension along with client parameters and application state, not the exposure of our server interfaces.

What we changed: The wildcard was replaced with a specific target origin, so messages now only reach the intended context. A lint rule automatically prevents the wildcard from being used in future changes.

Weak iOS Keychain accessibility configuration (medium, CVSS 5.3)

What was found: The iOS app stored sensitive data in the iOS Keychain with the accessibility level kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly. At that level the data stays available in device memory from the first unlock until the next restart, even if the device is locked again in the meantime. Exploiting this requires physical access to the device plus a jailbreak, which is why secuvera rates the attack complexity as high.

What we changed: This was the most demanding of the three changes and the reason why a longer period passed between the report and the retest.

heylogin has cryptographic operations that necessarily run on the devices of admins, because we as the operator do not hold the keys required for them and decryption happens exclusively on the client side. One example: when someone is newly invited to an organisation, an admin device performs a cryptographic operation in the background so that the invited person gains access to the logins shared with them. Operations like these could previously start even while the device was locked.

Once the affected Keychain entries were moved to kSecAttrAccessibleWhenUnlockedThisDeviceOnly, that was no longer possible. We therefore had to substantially rebuild the application first, so that these operations are reliably carried out as soon as an admin device is unlocked again. We then rolled the change out in an internal beta and tested it, followed by an open beta to verify that everything still works as it did before. We deliberately did not shorten this step, because core heylogin functionality depends on these background operations.

For individual operations that genuinely require background access, we deliberately continue to use kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly, so the accessibility level matches the protection needs of each entry. The operations now take longer to execute. We consider this acceptable because the keys are accessible only while the device is actually unlocked.

Two informational findings

In addition to the vulnerabilities, secuvera recorded two informational findings. According to the report these pose no direct risk and do not factor into the security level rating. They were not part of the retest. We are addressing them openly nonetheless:

  • Hardening of the container configuration. According to the report, processes in several containers ran with root privileges and the available Linux capabilities were not restricted. secuvera states that this does not amount to a vulnerability, but it is room for hardening. We have since hardened our containers using common methods. In particular, a dedicated user is configured in all containers so that processes no longer run with root privileges. Since the informational findings were not part of the retest, this change has not been verified by secuvera.
  • No TLS certificate pinning. Our applications do not additionally check server certificates against a fixed list. secuvera downgraded this point from a vulnerability to an informational finding during the assessment, referring to the OWASP Pinning Cheat Sheet, which advises against certificate pinning because the risk of outages generally outweighs the security benefit. We share this assessment and deliberately do not use pinning. In any case, the protection of your data at heylogin does not rest on the transport layer alone: vault contents are end-to-end encrypted and therefore remain protected even if transport encryption were compromised.

Full transparency

We are publishing the documents so that you can form your own view:

The report contains the full description of all findings including the CVSS assessment. Component and path details have been redacted in the public version.

Timeline

  • 10 to 19 September 2025: secuvera carries out the static source code analysis.
  • 17 November 2025: Closing report with three medium severity vulnerabilities and two informational findings is issued.
  • January to June 2026: Remediation of all three vulnerabilities.
  • Until the end of August 2026: Rollout of the changes across all components: browser extensions for all supported browsers, iOS app and web application.
  • 3 to 4 September 2026: Retest by secuvera, all vulnerabilities confirmed as remediated.
  • 10 September 2026: Final report and attestation are issued.
  • 24 September 2026: Publication of this report.