OpenBao is a software solution to manage, store, and distribute sensitive data including secrets, certificates, and keys.
This report summarizes scanner evidence for openbao/openbao, a Go project with 8,806 GitHub stars. SynthScan examined 711,536 lines of code across 3836 source files, recording 631 pattern matches distributed across 10 syntactic categories. The legacy adjusted pattern signal is 0.9 (Low pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Payload schema: 1.0.0 · Engine: 2.0.0 · Scoring: heuristic-density-v1 · Scan date: 2026-10-31.
Can maintainers explain intent, assumptions, and trade-offs? 616 finding(s).
Are imports declared and package/API names verified? 15 finding(s).
Are wrappers, guards, and repeated structures necessary? 3 finding(s).
Which changes need focused human review? 631 finding(s).
This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 631 distinct pattern matches across 10 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | ui/app/macros/lazy-capabilities.js | 1 | /** | COMMENT |
| LOW | ui/app/lib/path-to-tree.js | 21 | // bar: { | COMMENT |
| LOW | ui/tests/helpers/index.js | 21 | // For example, if you need an authenticated session for each | COMMENT |
| LOW | ui/lib/kubernetes/addon/utils/generated-role-rules.js | 1 | /** | COMMENT |
| LOW | ui/lib/pki/addon/components/pki-issuer-cross-sign.js | 181 | }, | COMMENT |
| LOW | ui/lib/pki/addon/components/pki-issuer-cross-sign.js | 201 | // -> For 1 though, make sure to give the `signedCaChain` in the | COMMENT |
| LOW | .release/docker/docker-entrypoint.sh | 1 | #!/usr/bin/dumb-init /bin/sh | COMMENT |
| LOW | website/content/blog/2026-07-30-declarative-plugins.md | 81 | // plugin catalog. This is allows operators to immediately use the plugin | COMMENT |
| LOW | website/content/blog/2026-07-30-declarative-plugins.md | 101 | COMMENT | |
| LOW | …bsite/content/blog/2026-07-09-transactional-storage.md | 81 | and thus not relevant to improving snapshot consistency. | COMMENT |
| LOW | internal/serviceregistration/service_registration.go | 41 | // complete. The redirectAddr is an optional parameter for implementations | COMMENT |
| LOW | internal/serviceregistration/service_registration.go | 61 | // | COMMENT |
| LOW | internal/serviceregistration/service_registration.go | 81 | // If errors are returned, Vault only logs a warning, so it is | COMMENT |
| LOW | …l/serviceregistration/kubernetes/testing/testserver.go | 41 | //go:embed token | COMMENT |
| LOW | …ternal/serviceregistration/kubernetes/client/config.go | 21 | // The client itself does nothing directly with these variables, it's | COMMENT |
| LOW | …ternal/serviceregistration/kubernetes/client/config.go | 81 | // The CACertPool is promoted to the top level from being originally on the TLSClientConfig | COMMENT |
| LOW | …eregistration/kubernetes/client/cmd/kubeclient/main.go | 1 | // Copyright (c) HashiCorp, Inc. | COMMENT |
| LOW | internal/physical/postgresql/postgresql.go | 721 | } | COMMENT |
| LOW | internal/physical/pebbledb/pebbledb.go | 681 | COMMENT | |
| LOW | internal/physical/raft/io.go | 1 | // Protocol Buffers for Go with Gadgets | COMMENT |
| LOW | internal/physical/raft/transaction.go | 561 | return err | COMMENT |
| LOW | internal/physical/raft/transaction.go | 921 | // transaction was started) modified this entry. All WALs did not affect | COMMENT |
| LOW | internal/physical/raft/raft_autopilot.go | 61 | // LastContactThreshold is the limit on the amount of time a server can go | COMMENT |
| LOW | internal/physical/raft/snapshot.go | 41 | // | COMMENT |
| LOW | internal/physical/raft/varint.go | 1 | // Protocol Buffers for Go with Gadgets | COMMENT |
| LOW | internal/physical/raft/raft.go | 161 | COMMENT | |
| LOW | internal/physical/raft/raft.go | 201 | // fallback will be to interact with the raft instance directly. This can only | COMMENT |
| LOW | internal/physical/raft/raft.go | 261 | // LeaderClientKey is the client key for the follower node to establish | COMMENT |
| LOW | internal/physical/raft/snapshot/archive.go | 1 | // Copyright IBM Corp. 2019, 2025 | COMMENT |
| LOW | internal/physical/crosstest/cross_test.go | 1 | // We wish to build a backend cross-testing framework which allows us to find | COMMENT |
| LOW | internal/audit/audit.go | 21 | // a possibility. | COMMENT |
| LOW | internal/audit/formatter.go | 21 | } | COMMENT |
| LOW | internal/audit/formatter.go | 41 | // within the response data - these are conventionally the only fields present in a list response - see | COMMENT |
| LOW | internal/audit/hashstructure.go | 221 | // to be hashed. If there is an error, walking will be halted | COMMENT |
| LOW | internal/http/index.go | 141 | // wants to set or is aware of. Similarly, if configuration states to | COMMENT |
| LOW | internal/http/handler.go | 1161 | // | COMMENT |
| LOW | internal/http/util.go | 101 | // | COMMENT |
| LOW | internal/http/util.go | 141 | } | COMMENT |
| LOW | internal/command/pki_reissue_intermediate_test.go | 21 | COMMENT | |
| LOW | internal/command/pki_reissue_intermediate_test.go | 41 | runPkiListIntermediateTests(t, client) | COMMENT |
| LOW | internal/command/proxy.go | 1021 | return cfg, nil | COMMENT |
| LOW | internal/command/pki_list_intermediate_test.go | 21 | // RootX1 RootX2 RootX4 RootX3 | COMMENT |
| LOW | internal/command/pki_issue_intermediate_test.go | 21 | // pki-root | pki-newroot | pki-empty | COMMENT |
| LOW | internal/command/pki_issue_intermediate_test.go | 41 | COMMENT | |
| LOW | internal/command/agent.go | 1121 | return nil, fmt.Errorf("error validating configuration: %w", err) | COMMENT |
| LOW | internal/command/pki_verify_sign_test.go | 21 | COMMENT | |
| LOW | internal/command/pki_verify_sign_test.go | 161 | for i, interfa := range list { | COMMENT |
| LOW | internal/command/debug.go | 41 | COMMENT | |
| LOW | internal/command/commands.go | 61 | EnvVaultLogLevel = "BAO_LOG_LEVEL" | COMMENT |
| LOW | internal/command/commands.go | 81 | // flagTLSServerName is the flag used in the base command to read in | COMMENT |
| LOW | internal/command/token/helper_external.go | 41 | return path, nil | COMMENT |
| LOW | internal/command/agentproxyshared/cache/lease_cache.go | 1141 | } | COMMENT |
| LOW | …nal/command/agentproxyshared/cache/cachememdb/index.go | 21 | // Token is the token that fetched the response held by this index | COMMENT |
| LOW | …nal/command/agentproxyshared/cache/cachememdb/index.go | 41 | COMMENT | |
| LOW | …nal/command/agentproxyshared/cache/cacheboltdb/bolt.go | 41 | COMMENT | |
| LOW | internal/helper/configutil/telemetry.go | 61 | // metric management enabled (use check with specified submission_url) | COMMENT |
| LOW | internal/helper/configutil/telemetry.go | 81 | CirconusCheckSubmissionURL string `hcl:"circonus_submission_url"` | COMMENT |
| LOW | internal/helper/configutil/telemetry.go | 101 | // CirconusCheckTags is a comma separated list of tags to apply to the check. Note that | COMMENT |
| LOW | internal/helper/identity/types.pb.go | 41 | ParentGroupIDs []string `protobuf:"bytes,4,rep,name=parent_group_ids,json=parentGroupIds,proto3" json:"parent_group_ids | COMMENT |
| LOW | internal/helper/identity/types.pb.go | 241 | // Entity represents an entity that gets persisted and indexed. | COMMENT |
| 500 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | internal/command/agent_test.go | 1302 | // Definitely not thread-safe, do not use t.Parallel with this. | COMMENT |
| MEDIUM | …database/cassandra/test-fixtures/no_tls/cassandra.yaml | 14 | # This version is provided to facilitate pain-free upgrades for existing | COMMENT |
| MEDIUM | …database/cassandra/test-fixtures/no_tls/cassandra.yaml | 1853 | # each write which may be lower in order to facilitate availability. | COMMENT |
| MEDIUM | …tabase/cassandra/test-fixtures/with_tls/cassandra.yaml | 14 | # This version is provided to facilitate pain-free upgrades for existing | COMMENT |
| MEDIUM | …tabase/cassandra/test-fixtures/with_tls/cassandra.yaml | 1853 | # each write which may be lower in order to facilitate availability. | COMMENT |
| MEDIUM | internal/builtin/logical/pki/acme_wrappers.go | 55 | // acmeWrapper a basic wrapper that all ACME handlers should leverage as the basis. | COMMENT |
| MEDIUM | internal/builtin/logical/pki/backend_test.go | 6826 | // - Definitely will work with sign-verbatim. | COMMENT |
| MEDIUM | internal/builtin/logical/pki/storage_migrations.go | 140 | // We always want to write out this log entry as the secondary clusters leverage this path to wake up | COMMENT |
| MEDIUM | internal/vault/token_store.go | 1463 | // minted service tokens. This function is meant to be robust so as to allow vault | COMMENT |
| MEDIUM | sdk/helper/testcluster/util.go | 160 | // Be robust to multiple nodes thinking they are active. This is possible in | COMMENT |
| MEDIUM | sdk/helper/testcluster/util.go | 165 | // etc. so be robust against it. The best solution would be to have some sort | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | …database/cassandra/test-fixtures/no_tls/cassandra.yaml | 1608 | # Step 1: Set internode_encryption=<dc|rack|all> and explicitly set optional=true. Restart all nodes | COMMENT |
| LOW⚡ | …database/cassandra/test-fixtures/no_tls/cassandra.yaml | 1610 | # Step 2: Set optional=false (or remove it) and if you generated truststores and want to use mutual | COMMENT |
| LOW⚡ | …database/cassandra/test-fixtures/no_tls/cassandra.yaml | 1666 | # Step 1: Set enabled=true and explicitly set optional=true. Restart all nodes | COMMENT |
| LOW⚡ | …database/cassandra/test-fixtures/no_tls/cassandra.yaml | 1668 | # Step 2: Set optional=false (or remove it) and if you generated truststores and want to use mutual | COMMENT |
| LOW | …database/cassandra/test-fixtures/no_tls/cassandra.yaml | 1525 | # WARNING: This snitch is deprecated and it is scheduled to be removed | COMMENT |
| LOW⚡ | …tabase/cassandra/test-fixtures/with_tls/cassandra.yaml | 1608 | # Step 1: Set internode_encryption=<dc|rack|all> and explicitly set optional=true. Restart all nodes | COMMENT |
| LOW⚡ | …tabase/cassandra/test-fixtures/with_tls/cassandra.yaml | 1610 | # Step 2: Set optional=false (or remove it) and if you generated truststores and want to use mutual | COMMENT |
| LOW⚡ | …tabase/cassandra/test-fixtures/with_tls/cassandra.yaml | 1666 | # Step 1: Set enabled=true and explicitly set optional=true. Restart all nodes | COMMENT |
| LOW⚡ | …tabase/cassandra/test-fixtures/with_tls/cassandra.yaml | 1668 | # Step 2: Set optional=false (or remove it) and if you generated truststores and want to use mutual | COMMENT |
| LOW | …tabase/cassandra/test-fixtures/with_tls/cassandra.yaml | 1525 | # WARNING: This snitch is deprecated and it is scheduled to be removed | COMMENT |
| LOW⚡ | sdk/logical/token.go | 200 | // Step 1: Copy entry policies to a new struct | COMMENT |
| LOW⚡ | sdk/logical/token.go | 204 | // Step 2: Sort and join copied policies | COMMENT |
| LOW⚡ | sdk/logical/token.go | 211 | // Step 3: Add namespace ID | COMMENT |
| LOW⚡ | sdk/logical/token.go | 218 | // Step 4: Remove the first character in the string, as it's an unnecessary delimiter | COMMENT |
| LOW⚡ | sdk/logical/token.go | 221 | // Step 5: Hash the sum | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | …database/cassandra/test-fixtures/no_tls/cassandra.yaml | 1608 | # Step 1: Set internode_encryption=<dc|rack|all> and explicitly set optional=true. Restart all nodes | COMMENT |
| LOW⚡ | …database/cassandra/test-fixtures/no_tls/cassandra.yaml | 1610 | # Step 2: Set optional=false (or remove it) and if you generated truststores and want to use mutual | COMMENT |
| LOW⚡ | …database/cassandra/test-fixtures/no_tls/cassandra.yaml | 1666 | # Step 1: Set enabled=true and explicitly set optional=true. Restart all nodes | COMMENT |
| LOW⚡ | …database/cassandra/test-fixtures/no_tls/cassandra.yaml | 1668 | # Step 2: Set optional=false (or remove it) and if you generated truststores and want to use mutual | COMMENT |
| LOW⚡ | …tabase/cassandra/test-fixtures/with_tls/cassandra.yaml | 1608 | # Step 1: Set internode_encryption=<dc|rack|all> and explicitly set optional=true. Restart all nodes | COMMENT |
| LOW⚡ | …tabase/cassandra/test-fixtures/with_tls/cassandra.yaml | 1610 | # Step 2: Set optional=false (or remove it) and if you generated truststores and want to use mutual | COMMENT |
| LOW⚡ | …tabase/cassandra/test-fixtures/with_tls/cassandra.yaml | 1666 | # Step 1: Set enabled=true and explicitly set optional=true. Restart all nodes | COMMENT |
| LOW⚡ | …tabase/cassandra/test-fixtures/with_tls/cassandra.yaml | 1668 | # Step 2: Set optional=false (or remove it) and if you generated truststores and want to use mutual | COMMENT |
| LOW | internal/vault/core_metrics.go | 291 | // Therefore, we need to check if c.mounts is nil. If we do not, this will panic when | COMMENT |
| LOW⚡ | sdk/logical/token.go | 200 | // Step 1: Copy entry policies to a new struct | COMMENT |
| LOW⚡ | sdk/logical/token.go | 204 | // Step 2: Sort and join copied policies | COMMENT |
| LOW⚡ | sdk/logical/token.go | 211 | // Step 3: Add namespace ID | COMMENT |
| LOW⚡ | sdk/logical/token.go | 218 | // Step 4: Remove the first character in the string, as it's an unnecessary delimiter | COMMENT |
| LOW⚡ | sdk/logical/token.go | 221 | // Step 5: Hash the sum | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL | ui/tests/acceptance/raft-storage-test.js | 35 | this.config.data.config.servers.pop(); | CODE |
| CRITICAL | ui/lib/pki/addon/components/page/pki-issuer-details.ts | 19 | return this.args.issuer.parsedCertificate.parsing_errors.map((e: Error) => e.message).join(', '); | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | ui/lib/kubernetes/addon/utils/generated-role-rules.js | 6 | const example = `# The below is an example that you can use as a starting point. | CODE |
| MEDIUM | …database/cassandra/test-fixtures/no_tls/cassandra.yaml | 61 | # initial_token allows you to specify tokens manually. While you can use it with | COMMENT |
| MEDIUM | …database/cassandra/test-fixtures/no_tls/cassandra.yaml | 1042 | # you may want to adjust max_value_size accordingly. This should be positive and less than 2048. | COMMENT |
| MEDIUM | …tabase/cassandra/test-fixtures/with_tls/cassandra.yaml | 61 | # initial_token allows you to specify tokens manually. While you can use it with | COMMENT |
| MEDIUM | …tabase/cassandra/test-fixtures/with_tls/cassandra.yaml | 1042 | # you may want to adjust max_value_size accordingly. This should be positive and less than 2048. | COMMENT |
| MEDIUM | internal/builtin/logical/pki/chain_util.go | 538 | // not sufficient as discussed above -- we also need to find any | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | ui/tests/unit/services/wizard-test.js | 72 | args: ['fake-key'], | CODE |
| LOW | …/tests/integration/components/kv-object-editor-test.js | 79 | assert.dom('input').hasAttribute('placeholder', 'foo', 'Placeholder applied to key input'); | CODE |
| LOW | …/tests/integration/components/kv-object-editor-test.js | 80 | assert.dom('textarea').hasAttribute('placeholder', 'bar', 'Placeholder applied to value input'); | CODE |
| LOW | …ests/integration/components/autocomplete-input-test.js | 48 | assert.dom('input').hasAttribute('placeholder', this.placeholder, 'Input placeholder renders'); | CODE |
| LOW | …tests/integration/components/object-list-input-test.js | 47 | .hasAttribute('placeholder', firstKey.placeholder, 'it renders placeholder text'); | CODE |
| LOW | …ests/integration/components/oidc/provider-form-test.js | 76 | .hasAttribute('placeholder', 'e.g. https://example.com:8200', 'issuer placeholder text is correct'); | CODE |
| LOW | internal/builtin/credential/jwt/provider_gsuite_test.go | 548 | "gsuite_admin_impersonate": "admin@example.com", | CODE |
| LOW | internal/builtin/credential/jwt/provider_gsuite_test.go | 606 | "gsuite_admin_impersonate": "admin@example.com", | CODE |
| LOW | internal/builtin/logical/transit/path_import_test.go | 277 | keyType: "fake-key-type", | CODE |
| LOW | internal/builtin/logical/pki/path_issue_sign_test.go | 332 | EmailAddresses: []string{"admin@example.com"}, | CODE |
| LOW | internal/vault/control_group_test.go | 222 | DisplayName: "user@example.com", | CODE |
| LOW | internal/vault/control_group_test.go | 350 | DisplayName: "user@example.com", | CODE |
| LOW | internal/vault/logical_system_namespaces_test.go | 799 | req.Data["unlock_key"] = "placeholder" | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | …database/cassandra/test-fixtures/no_tls/cassandra.yaml | 10 | # This file is provided in two versions: | COMMENT |
| MEDIUM | …tabase/cassandra/test-fixtures/with_tls/cassandra.yaml | 10 | # This file is provided in two versions: | COMMENT |
| MEDIUM | scripts/release/build.sh | 24 | # Create a git tag locally so Go picks it up in build metadata. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …database/cassandra/test-fixtures/no_tls/cassandra.yaml | 1257 | # Set sstable_preemptive_open_interval to null for disabled which is equivalent to | COMMENT |
| LOW | …tabase/cassandra/test-fixtures/with_tls/cassandra.yaml | 1257 | # Set sstable_preemptive_open_interval to null for disabled which is equivalent to | COMMENT |
| LOW | .github/workflows/changelog-checker.yml | 31 | # Check if there is a diff in the changelog directory. | COMMENT |
| LOW | .github/workflows/docs-ci.yml | 28 | # Check if any absolute links were found | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | ui/app/lib/capabilities.js | 60 | export function addCapabilityRelationships(capabilities, jsonAPIDoc) { | CODE |
| LOW | ui/app/helpers/supported-managed-auth-backends.js | 10 | export function supportedManagedAuthBackends() { | CODE |
| LOW | …src/theme/NavbarItem/DocsVersionDropdownNavbarItem.tsx | 9 | export default function DocsVersionDropdownNavbarItemWrapper( | CODE |