Sequence - Identity Document

QuantstampCode version: not recorded (see the report)

Quantstamp reviewed Sequence (Sequence - Identity Document) on 2 Dec 2025: 46 findings, 0 critical; 25 marked fixed, 21 open.

No open critical findings
Open the reportOpen Sequence’s security record

Report hosted on certificate.quantstamp.com.

Trustblock does not review code.

Findings46

Statuses are the security firm’s own, from its report.

SeverityOpenAcknowledgedFixed
Critical000
High009
Medium1014
Low2002
HighAvoid Legacy EC2 Metadata FormatFixed

The EC2 instances are configured to use Instance Metadata Service version 1 (IMDSv1), which is susceptible to server-side request forgery (SSRF) and other local privilege escalation attacks. IMDSv1 is a request/response interface accessible via HTTP and lacks the session-based protections introduced in IMDSv2. Because it allows for unauthenticated HTTP requests from any process running on the instance, an attacker with the ability to execute code or exploit SSRF vulnerabilities can retrieve sensitive metadata — including IAM role credentials — from the metadata service.

HighEnable Deletion Protection for Load BalancersFixed

Load balancers should be protected from accidental deletion.

HighEnable Image Scanning for Docker Images Stored in EcrFixed

The ECR container registry should do a vulnerability scan on every pushed image.

HighHigh Severity CVE Present in Code BaseFixed

The system includes a dependency that is affected by CVE-2025-22869, a high-severity vulnerability. This CVE refers to a known flaw in the `golang.org/x/crypto`. Use of vulnerable third-party components introduces serious risks, as they may be exploited even without a direct flaw in the application's own code. Attackers often scan systems for known vulnerable versions, especially those that are widely used. Failure to patch or update this dependency may violate basic supply chain security principles and potentially leave the system open to compromise.

HighIssuers in JWT tokens should never allow for unencrypted trafficFixed

The OpenID Connect issuer (iss) used in the authentication flow is configured with an insecure `http://` scheme, violating the OIDC specification and creating a critical security risk. According to the OpenID Connect Core 1.0 specification, the issuer MUST use the https scheme to ensure integrity, authenticity, and confidentiality of identity tokens and discovery documents. Using plain http opens the door to MITM (man-in-the-middle) attacks, token forgery, and discovery document tampering, especially if DNS spoofing or network interception is possible. Even if the server is internal or behind a VPN, relying on http for OIDC interactions undermines the security model of federated identity, which assumes cryptographically verifiable trust boundaries.

HighJWT Token Validation and Verification Are Explicitly DisabledFixed

`identity-instrument-master/auth/idtoken/auth_handler.go`, line 108: The application disables both signature verification and claims validation when parsing a JWT token: ``` jwt.Parse([]byte(idToken), jwt.WithVerify(false), jwt.WithValidate(false)) ``` This effectively turns off all critical security checks provided by JWTs, allowing any token—malicious or malformed—to be accepted as valid. An attacker can forge tokens with arbitrary claims, including user identifiers, roles, and permissions, potentially resulting in full account takeover, privilege escalation, or bypass of authentication. JWT's purpose is to assert identity and claims integrity via cryptographic signatures. Disabling .WithVerify(false) skips this integrity check, while .WithValidate(false) disables checks like expiration (exp) or issuer (iss). Combined, this configuration nullifies the entire trust model of JWTs.

HighMissing Key Generation Update LogicFixed

The Decrypt function in `encryption/pool.go` contains a TODO comment indicating that key generation should be updated if needed, but this logic is not implemented. When a key from an older generation is used for decryption, the system should automatically update it to the current generation to ensure it remains accessible as TTPs rotate their keys. The system does not check if the key's generation is current, nor does it attempt to update the key to the latest generation. If keys cannot be updated to the current generation, users may lose access to their encrypted data.

HighRecommending to Sanitize Input and Use Multi-Tier Architecture Instead of Passing Down the HTTP Context to Every FunctionFixed

The HTTP context of API calls contains all external, user-provided information. By nature, this data cannot be trusted and needs to be validated against tampering. The most common design for APIs consists of a resource layer, which checks the inputs for validity and passes down the sanitized inputs for further processing. The context itself should not be passed further down.

HighSet Immutable Tags for Docker Images Stored in EcrFixed

In order to maintain stability with respect to image tags and versions, it is important to set the tags in ECR to be immutable.

MediumA User Is Able to Pass in an Empty Nonce ValueFixed

The application contains logic that checks if the value of a variable nonceVal is equal to an empty string (`identity-instrument-master/rpc/internal/attestation/middleware.go`, line 69\) before performing further operations. However, if the input (Header `"X-Attestation-Nonce"`) is a string containing only whitespace (e.g., " "), the check incorrectly allows the code to continue, as it only excludes exactly empty strings. This leads to a scenario where malformed or unintended input values—such as whitespace—are treated as valid. In security-sensitive contexts, such as nonce verification, this can result in logic flaws, inconsistent behavior, or bypass conditions.

Show 10 more
MediumAuth Commitment Overwrite Allows DoS on User AuthenticationFixed

When initiating an auth flow, the identity instrument does not request any proof that one owns the auth keypair. The authkey parameter in any request simply represents the public key component of the keypair, and can be easily hijacked. An attacker could create a new auth flow with the a keypair that is already in use at the moment. This will allow the attacker to override the owner's auth key record, associating it with the attacker's signer. The system, however, will not allow the attacker, nor the true owner, to proceed with signing transactions, causing a temporary DoS. The owner, in turn, will be forced to re-authenticate.

MediumAuth Session Could be Abused and Lead to DoS AttacksFixed

Upon a valid auth flow, one could abuse the sign logic by submitting many sign requests. Whenever a user session is in place, code-level rate limiting is highly advisable as an extra security layer to prevent Denial-of-Service (DoS) attacks, since cloud-based ones are less granular and generally based on IPs, which could be rotated.

MediumAuto-Redirect to Auth Does Not Work for Invalid SubdomainsFixed

The application renders parts of the authenticated user interface (UI) to unauthenticated users who visit arbitrary or deep-linked paths (e.g., [https://v3.sequence-dev.app/foo](https://v3.sequence-dev.app/foo)). While backend API calls fail due to lack of authentication, the presence of elements like "Logout" and partial dashboard components implies that routing and view rendering are not properly gated by authentication status. This exposes internal UI logic and workflows, which can aid attackers in reconnaissance, phishing, or crafting targeted social engineering attacks. In more severe scenarios, it may also leak static content or mislead users into believing they are logged in. Even if no sensitive data is exposed directly, showing logged-in-only UI to unauthenticated users violates the principle of least privilege and secure defaults.

MediumDrop Invalid Headers on the Load Balancer LevelFixed

A variety of attacks are actually performed using invalid symbols in headers. There is a setting in the load balancer, if it is an application load balancer, to prevent those headers to be forwarded to the target resource.

MediumDynamoDB Table Safety Considerations with Respect to Current DesignFixed

There are two critical considerations in the way the application interacts with Amazon DynamoDB, especially in the context of permanent data storage and unbounded payload sizes: A. Time-to-Live (TTL) Not Explicitly Controlled DynamoDB offers an optional Time to Live (TTL) mechanism that allows automatic deletion of expired items, based on a user-defined timestamp attribute. If the application intends to store items permanently, it is vital that: - No TTL attribute (e.g., ttl or expirationTime) is accidentally set. - Data written into the table is validated to ensure TTL values are not unintentionally populated. If TTL is enabled without strict control, this can lead to silent data deletion, resulting in: - Unexpected missing records - Failures in business logic - Irrecoverable loss of important data (DynamoDB TTL deletions are permanent) B. Risk of Exceeding the 400 KB Item Limit DynamoDB enforces a hard 400 KB size limit per item (including attribute names and metadata). If the data model allows unbounded growth — such as appending to a list or storing user-generated content — there's a real risk of: - Write failures (ValidationException: Item size has exceeded the maximum allowed size) - Application crashes or inconsistencies due to write failures - Inability to restore or replicate oversized items This is especially critical when handling logs, document snapshots, or unvalidated client input.

MediumEnable Enhanced Monitoring on EC2 InstancesFixed

When using EC2-instances, if real-time view on data is critical, it is advisable to enable enhanced monitoring. This also enables teams to get alarms more timely.

MediumEnsure to Have Termination Protection for EC2 InstancesFixed

When using EC2-instances, it is advisable to enable termination protection, since it is otherwise possible to accidentally lose data or put the cluster in an undesired state.

MediumLack of Email and Length Validation Poses Security RisksFixed

In the OTP authentication flow, in the commit stage, input email lengths are not validated. This creates an opportunity for malicious actors to send OTP requests with a large payload. This could open-up DoS attack vectors, such as Denial-of-Service (e.g., memory exaustion) or simply cause AWS costs to increase. Developers seem to be somewhat aware of this issue, as validation is currently stated as a TODO comment. ``` func (s \*Sender) NormalizeRecipient(recipient string) (string, error) { // TODO: Validate email address return Normalize(recipient), nil } ``` Similar to the missing email validation logic in the OTP-based auth flow, the sign logic does not verify the digest length, allowing for any digest size (generally expected to be 256 bytes long). The same issues concerning a potentially unbounded input apply here, namely, the risk of DoS attacks and potentially higher AWS costs. Similar to the ones described above, the `auth_key` length should be validated as well.

MediumNo CI/CD Tool in Place for Pipeline TestsFixed

In order to prevent issues when deploying changes to the code, it is recommended to employ a so-called CI/CD tool. Examples are: - Github Workflows - Jenkins - Bitbucket pipelines - Gitlab pipelines - CircleCI These tools can be used to ensure that a proper code change process is in place and that tests are run every time a change takes place.

MediumNo locked in version in DockerfileFixed

When using `FROM` directives in Docker files, it is important to specify the version directly and not just use latest (since this is a changing tag). Alternatively, define a specific digest of the image you aim to use.

Show 5 more
MediumNo Way to Rotate Underlying Private KeysFixed

The system does not provide a mechanism to rotate or replace the underlying private keys used for cryptographic operations. Key rotation is a critical security practice to limit the impact of key compromise and to comply with security best practices.

MediumUnhandled Errors in CodeFixed

Several places in the application lack proper error handling, where errors are either ignored silently, logged without context, or not acted upon. This practice leads to undefined behavior, unstable execution paths, and security blind spots, especially if these failures impact authentication, access control, data validation, or external service communication. Uncaught errors can: - Suppress indicators of failed security checks - Lead to silent partial failures or inconsistent states - Open up denial-of-service conditions or privilege escalation pathways when failure isn’t managed Below is a list of instances where error handling was found to be missing or inadequate: - `/identity-instrument-master/auth/authcode/auth_handler.go`, line 270: The function `jwtKey.Set` can also produce an error, which is not explicitly checked for in this function. - `/identity-instrument-master/cmd/ingress-proxy/main.go`, line 30 - `/identity-instrument-master/data/cipher_key.go`, line 53: The `Write` function is not explicitly checked for an error that may be produced. - `/identity-instrument-master/encryption/pool.go`, line 219\. - `/identity-instrument-master/proto/identity-instrument.gen.go`, lines 554, 541, 540 and 528\. - `/identity-instrument-master/rpc/internal/attestation/middleware.go`, line 64\. - `/identity-instrument-master/rpc/internal/attestation/userdata.go`, line 17\. - `/identity-instrument-master/rpc/auth.go`, line 369\.

MediumUse Encryption at Rest with Dynamodb TablesFixed

When defining a DynamoDB table, one needs to ensure that the data on the server is encrypted.

LowSigned Messages Are Prone to Replay AttacksFixed

From the code alone, it is unclear what format messages should have. If any, they are not enforced by the `Sign` logic. This leads to an absence of checks for replay attacks, including a nonce and chainid.

LowUse Builder Libraries for Special StringsFixed

The codebase builds URLs using manual string concatenation, such as: `/identity-instrument-master/cmd/ingress-proxy/main.go`, line 89: ``` url := "http://" + r.Host + r.URL.String() ``` This approach is error-prone and unsafe, especially when user input or variable data is embedded into URLs. Improper handling of special characters, path delimiters, or query parameters can lead to: - Incorrect URL encoding, breaking API calls or routing logic - Injection vulnerabilities, especially if user-controlled values are appended unchecked - Ambiguous or malformed URLs, which can degrade reliability or security This pattern bypasses standard encoding protections and lacks guardrails against constructing invalid or unsafe URLs — particularly problematic in systems that construct dynamic API calls, redirects, or query links.

Contracts in scope

No deployed address is recorded for this audit.

The report names a repository or files. Open the report to see its scope.

Part of Sequence’s security record

Sequence
Audits3 audits by 1 firmLast audit Dec 2025, by Quantstamp.
Critical findingsNo open critical findingsAcross 3 reports.
Open Sequence’s security record

Security firm

Quantstamp

236 projects reviewed · 332 reports · latest Oct 2026

See Quantstamp’s audits

Something wrong on this page? A missing report, a wrong date, a finding that was fixed since. Tell us and we check it against its source.

Tell us