Catalog reference¶
Every table below is generated from catalog v5, the same manifest the server validates writes against. kb_types returns the identical contract and the same descriptions at runtime and is the source to read from a client; this page exists so the contract is reviewable without a running server. Regenerate it with make docs-catalog.
The catalog declares 35 node types and 52 relation types. Conventions that the catalog does not enforce, and the longer reasoning behind each type, live in Graph and search.
What a write is checked against¶
| Gate | Declared in | Rejects |
|---|---|---|
| Type name | nodes / relations keys |
An unknown type, on write and on schema lookup. |
| Required properties | required map |
A missing required property, or one whose value fails its rule. |
| Optional properties | optional map |
A declared optional property that is null or whose value fails its rule. An absent one is accepted, and properties outside both maps are stored as submitted and are not validated. |
| Format rule | formats, the validator, and the discovery schema |
A value that does not match the published spelling. A rule missing from any of the three places would silently weaken the contract, so a test pins all three. |
| Identity | identity.properties |
A later write that changes an identity property of an existing record. |
| Inventory | inventory per node type |
A new node of a carries type without an ownership state, an ownership outside the type's allowed_ownership, and inventory state on a type whose declaration does not allow it. |
| Parent scope | identity.scope |
A new scoped node without exactly one scope relation in the same write, a re-parenting attempt, and a parent or scope-relation delete while the child exists. |
| Endpoint types | sources, targets, self_edge |
A relation between node types it does not connect, and a self edge where none is allowed. |
| Checks | checks ids per type |
Two properties that individually pass but disagree, and a relation whose endpoints' stored values do not actually stand in it. |
| Canonicalization | canonicalize ids per type |
Nothing: a declared non-canonical spelling is rewritten before validation, identity and storage. |
Shared limits¶
| Setting | Value | Meaning |
|---|---|---|
additional_properties |
true | Properties outside the declared maps are accepted and stored unvalidated. |
coercion |
false | No JSON type is converted. A string "443" is not an integer. |
depth |
16 | Maximum nesting depth of the properties object. |
integers |
signed64 |
Integers outside signed 64-bit are rejected. |
numbers |
finite double |
NaN and infinity are rejected. |
optional_nonnull |
true | A declared optional property may be absent but never null; clear one with remove_properties. |
properties_bytes |
65536 | Maximum size of one canonical properties object, in UTF-8 bytes. |
required_nonnull |
true | A required property may not be null or absent. |
Inventory state¶
Every node type declares inventory, which says whether its nodes hold ownership and authorization. Both are server-managed fields outside properties. Ownership is one of owned, dependency, candidate, rejected, and authorization is one of in_scope, out_of_scope, unknown. Only in_scope authorizes active testing; owned and unknown do not. The server performs no testing, so the agent enforces this rule.
| Declaration | Meaning |
|---|---|
carries |
The node holds its own ownership and authorization. A type that lists allowed_ownership accepts only those ownership values. |
inherits |
The node is parent-scoped and inherits ownership and authorization from its parent-scope chain, which ends at a node that carries them. |
none |
A vocabulary or shared record: the node holds no ownership or authorization. |
Bundled registries¶
dns_name classifies names against the bundled ICANN public suffix list, and service_name accepts the bundled service whitelist. The SHA-256 of each registry's parsed content is part of the fingerprinted contract, so refreshing either refuses workspaces written under the old one.
| Registry | Parsed-content SHA-256 |
|---|---|
public_suffix_list |
8fb96dafe8035fe8b7a98bc7f532fb885c20c92397782f75fec60979f4dc6fca |
service_names |
12ceb1efcec0b70c784e5764d88034a2fb7b159320b9c867514e454b5483f276 |
Node types¶
Identity is what makes two writes the same node. A parent scope adds the parent's UUID to that identity, so the same properties under two parents are two nodes.
| Node | Identity | Parent scope | Inventory | Required properties |
|---|---|---|---|---|
advisory |
value |
— | none |
value: advisory_id |
asn |
value |
— | carries |
value: asn |
certificate |
der_sha256 |
— | carries |
der_sha256: sha256 |
cloud_account |
provider, account_id |
— | carries |
account_id: cloud_account_idprovider: one of aws, gcp, azure |
cloud_resource |
hostname |
— | carries |
hostname: dns_nameservice: one of aws_cloudfront, aws_api_gateway, aws_lambda_url, aws_elastic_beanstalk, aws_elb, azure_app_service, azure_cloud_service, azure_public_ip, azure_traffic_manager, azure_front_door, azure_api_management, gcp_app_engine, gcp_firebase_hosting, gcp_firebase_rtdb |
cwe |
value |
— | none |
value: cwe |
dkim_record |
selector |
has_dkim_selector (source) |
inherits |
selector: dkim_selectorvalue: txt_value |
dmarc_record |
value |
— | none |
value: dmarc |
domain |
value |
— | carries |
value: dns_name |
email_address |
value |
— | carries |
value: email_address |
endpoint |
url, method |
— | carries |
method: methodurl: http_url |
finding |
rule, matcher |
has_finding (source) |
inherits |
matcher: finding_matcher_or_emptyrule: finding_ruleseverity: one of info, low, medium, high, critical, unknowntitle: printable_text_200 |
host_key |
algorithm, fingerprint_sha256 |
— | carries |
algorithm: one of ssh-rsa, ssh-dss, ssh-ed25519, ecdsa-sha2-nistp256, ecdsa-sha2-nistp384, ecdsa-sha2-nistp521, sk-ssh-ed25519@openssh.com, sk-ecdsa-sha2-nistp256@openssh.comfingerprint_sha256: sha256 |
http_fingerprint |
kind, value |
— | none |
kind: one of favicon_mmh3, body_sha256, header_sha256value: http_fingerprint_value |
identity_tenant |
provider, tenant_id |
— | carries |
provider: one of entra_id, oktatenant_id: tenant_id |
ip_address |
value |
— | carries |
value: ipversion: ip_version |
ip_cidr |
value |
— | carries |
value: cidrversion: ip_version |
mta_sts_policy |
value |
has_mta_sts_policy (source) |
inherits |
value: mta_sts |
organization |
registry, handle |
— | carries |
handle: rir_handleregistry: one of arin, ripe, apnic, lacnic, afrinic |
package |
purl |
— | carries |
purl: package_purl |
parameter |
name, location |
has_parameter (source) |
inherits |
location: one of query, body, header, cookie, pathname: parameter_name |
phone |
value |
— | carries |
value: phone_e164 |
port |
transport, number |
has_open_port (source) |
inherits |
number: uint16transport: one of tcp, udp, sctp |
registrar |
iana_id |
— | none |
iana_id: uint16name: printable_text_200 |
repository |
host, owner, name |
— | carries |
host: dns_namename: repo_nameowner: repo_ownerplatform: one of github, gitlab, bitbucket, gitea |
secret |
value_sha256 |
— | carries |
value_sha256: sha256 |
service |
name |
has_service (source) |
inherits |
name: service_name |
spf_record |
value |
— | none |
value: spf |
storage_bucket |
provider, name |
— | carries |
name: bucket_nameprovider: one of aws_s3, gcp_gcs, azure_blob |
subdomain |
value |
— | carries |
value: dns_name |
technology |
name |
— | none |
name: tech_token |
tls_cipher_suite |
version, name |
— | none |
name: tls_cipher_nameversion: one of ssl30, tls10, tls11, tls12, tls13, dtls10, dtls12, dtls13 |
tls_fingerprint |
kind, value |
— | none |
kind: one of jarm, ja3svalue: tls_fingerprint_value |
txt_record |
value |
— | none |
value: txt_value |
whois_registration |
registry, registry_domain_id |
has_registration (source) |
inherits |
registry: public_suffixregistry_domain_id: registry_domain_id |
Relation types¶
A relation's identity is scoped to its endpoints: two edges of one type between one pair of nodes are the same edge unless an identity property differs.
| Relation | Sources | Targets | Self edge | Identity | Required properties |
|---|---|---|---|---|---|
affected_by |
service, finding, endpoint, package |
advisory |
no | — | — |
aliases |
advisory |
advisory |
no | — | — |
announced_by |
ip_cidr |
asn |
no | — | — |
authenticates |
secret |
email_address, cloud_account, identity_tenant, repository, service, endpoint, storage_bucket, cloud_resource |
no | username, breach |
breach: breach_token_or_emptyusername: username_or_empty |
backed_by_bucket |
domain, subdomain, endpoint |
storage_bucket |
no | — | — |
caa_issue |
domain, subdomain |
domain, subdomain |
yes | flags, parameters, with parameters hashed order-independently |
flags: uint8parameters: caa_parameters |
caa_issuewild |
domain, subdomain |
domain, subdomain |
yes | flags, parameters, with parameters hashed order-independently |
flags: uint8parameters: caa_parameters |
cname_to |
domain, subdomain |
domain, subdomain |
yes | — | — |
contains_cidr |
ip_cidr |
ip_cidr |
no | — | — |
contains_ip |
ip_cidr |
ip_address |
no | — | — |
covers_name |
certificate |
domain, subdomain |
no | coverage |
coverage: one of exact, wildcard |
dname_to |
domain, subdomain |
domain, subdomain |
yes | — | — |
exposes_secret |
repository, endpoint, storage_bucket, cloud_resource, package |
secret |
no | location |
location: printable_text_1024 |
federates_with |
domain, subdomain |
identity_tenant |
no | — | — |
has_contact |
organization, registrar, domain, subdomain, repository, whois_registration, package |
email_address, phone, endpoint |
no | role |
role: one of abuse, admin, tech, registrant, billing, noc, security, published, iodef, maintainer |
has_dkim_selector |
domain, subdomain |
dkim_record |
no | — | — |
has_dmarc |
domain, subdomain |
dmarc_record |
no | — | — |
has_finding |
port, domain, subdomain, ip_address, ip_cidr, service, endpoint, certificate, parameter, dkim_record, storage_bucket, repository, identity_tenant, secret, mta_sts_policy, whois_registration, cloud_account, cloud_resource, package |
finding |
no | — | — |
has_http_fingerprint |
endpoint |
http_fingerprint |
no | — | — |
has_mail_exchange |
domain, subdomain |
domain, subdomain |
yes | preference |
preference: uint16 |
has_mta_sts_policy |
domain, subdomain |
mta_sts_policy |
no | — | — |
has_nameserver |
domain, subdomain |
domain, subdomain |
yes | — | — |
has_open_port |
ip_address |
port |
no | — | — |
has_parameter |
endpoint |
parameter |
no | — | — |
has_registration |
domain |
whois_registration |
no | — | — |
has_service |
port |
service |
no | — | — |
has_soa_primary |
domain, subdomain |
domain, subdomain |
yes | — | — |
has_spf |
domain, subdomain |
spf_record |
no | — | — |
has_srv_target |
domain, subdomain |
domain, subdomain |
yes | service, protocol, port, priority, weight |
port: uint16priority: uint16protocol: srv_labelservice: srv_labelweight: uint16 |
has_subdomain |
domain, subdomain |
subdomain |
no | — | — |
has_svcb_binding |
domain, subdomain |
domain, subdomain |
yes | record_type, priority, alpn, with alpn hashed order-independently |
alpn: alpn_tokenspriority: uint16record_type: one of https, svcb |
has_tls_fingerprint |
service |
tls_fingerprint |
no | — | — |
has_txt_record |
domain, subdomain |
txt_record |
no | — | — |
has_weakness |
finding, advisory |
cwe |
no | — | — |
hosted_on |
domain, subdomain, endpoint |
cloud_resource |
no | — | — |
in_account |
cloud_resource, storage_bucket, package |
cloud_account |
no | — | — |
issued_by |
certificate |
certificate |
yes | — | — |
links_to |
endpoint |
endpoint |
yes | element |
element: html_token_or_empty |
loads_package |
endpoint |
package |
no | — | — |
operated_by |
asn, ip_cidr |
organization |
no | — | — |
owns_repository |
domain, subdomain |
repository |
no | — | — |
presents_certificate |
service |
certificate |
no | mode, server_name, alpn_offered, with alpn_offered hashed order-independently |
alpn_offered: alpn_tokensmode: one of tls, dtls, starttls, quicserver_name: dns_or_explicit_empty |
presents_host_key |
service |
host_key |
no | — | — |
protected_by |
service, endpoint, domain, subdomain |
technology |
no | kind |
kind: one of waf, cdn, reverse_proxy, load_balancer |
published_from |
package |
repository |
no | — | — |
redirects_to |
endpoint |
endpoint |
yes | status |
status: redirect_status |
registered_through |
whois_registration |
registrar |
no | — | — |
resolves_to |
domain, subdomain |
ip_address |
no | — | — |
reverse_resolves_to |
ip_address |
domain, subdomain |
no | — | — |
runs_technology |
service, endpoint, domain, subdomain |
technology |
no | — | — |
serves_endpoint |
service |
endpoint |
no | — | — |
supports_tls_cipher |
service |
tls_cipher_suite |
no | — | — |
Which relations a node can carry¶
The same matrix as above, read from the node's side.
| Node | As source | As target |
|---|---|---|
advisory |
aliases, has_weakness |
affected_by, aliases |
asn |
operated_by |
announced_by |
certificate |
covers_name, has_finding, issued_by |
issued_by, presents_certificate |
cloud_account |
has_finding |
authenticates, in_account |
cloud_resource |
exposes_secret, has_finding, in_account |
authenticates, hosted_on |
cwe |
— | has_weakness |
dkim_record |
has_finding |
has_dkim_selector |
dmarc_record |
— | has_dmarc |
domain |
backed_by_bucket, caa_issue, caa_issuewild, cname_to, dname_to, federates_with, has_contact, has_dkim_selector, has_dmarc, has_finding, has_mail_exchange, has_mta_sts_policy, has_nameserver, has_registration, has_soa_primary, has_spf, has_srv_target, has_subdomain, has_svcb_binding, has_txt_record, hosted_on, owns_repository, protected_by, resolves_to, runs_technology |
caa_issue, caa_issuewild, cname_to, covers_name, dname_to, has_mail_exchange, has_nameserver, has_soa_primary, has_srv_target, has_svcb_binding, reverse_resolves_to |
email_address |
— | authenticates, has_contact |
endpoint |
affected_by, backed_by_bucket, exposes_secret, has_finding, has_http_fingerprint, has_parameter, hosted_on, links_to, loads_package, protected_by, redirects_to, runs_technology |
authenticates, has_contact, links_to, redirects_to, serves_endpoint |
finding |
affected_by, has_weakness |
has_finding |
host_key |
— | presents_host_key |
http_fingerprint |
— | has_http_fingerprint |
identity_tenant |
has_finding |
authenticates, federates_with |
ip_address |
has_finding, has_open_port, reverse_resolves_to |
contains_ip, resolves_to |
ip_cidr |
announced_by, contains_cidr, contains_ip, has_finding, operated_by |
contains_cidr |
mta_sts_policy |
has_finding |
has_mta_sts_policy |
organization |
has_contact |
operated_by |
package |
affected_by, exposes_secret, has_contact, has_finding, in_account, published_from |
loads_package |
parameter |
has_finding |
has_parameter |
phone |
— | has_contact |
port |
has_finding, has_service |
has_open_port |
registrar |
has_contact |
registered_through |
repository |
exposes_secret, has_contact, has_finding |
authenticates, owns_repository, published_from |
secret |
authenticates, has_finding |
exposes_secret |
service |
affected_by, has_finding, has_tls_fingerprint, presents_certificate, presents_host_key, protected_by, runs_technology, serves_endpoint, supports_tls_cipher |
authenticates, has_service |
spf_record |
— | has_spf |
storage_bucket |
exposes_secret, has_finding, in_account |
authenticates, backed_by_bucket |
subdomain |
backed_by_bucket, caa_issue, caa_issuewild, cname_to, dname_to, federates_with, has_contact, has_dkim_selector, has_dmarc, has_finding, has_mail_exchange, has_mta_sts_policy, has_nameserver, has_soa_primary, has_spf, has_srv_target, has_subdomain, has_svcb_binding, has_txt_record, hosted_on, owns_repository, protected_by, resolves_to, runs_technology |
caa_issue, caa_issuewild, cname_to, covers_name, dname_to, has_mail_exchange, has_nameserver, has_soa_primary, has_srv_target, has_subdomain, has_svcb_binding, reverse_resolves_to |
technology |
— | protected_by, runs_technology |
tls_cipher_suite |
— | supports_tls_cipher |
tls_fingerprint |
— | has_tls_fingerprint |
txt_record |
— | has_txt_record |
whois_registration |
has_contact, has_finding, registered_through |
has_registration |
Checks¶
Each check runs after the required map has validated the properties it reads. A relation check may also read both endpoints' stored properties; it runs on the properties that will be stored, after a patch or a matching earlier edge has been merged. The version suffix changes whenever what the check accepts changes.
| Check | Types | Rule |
|---|---|---|
advisory_cve_scores.1 |
advisory |
epss_score, epss_percentile and kev_added are refused unless value is a CVE id: FIRST scores and CISA lists CVEs only. |
aliases_toward_cve.1 |
aliases |
The target's id family must rank at least as high as the source's: CVE above GHSA above every OSV database id. Between equal ranks the source must be the alphabetically lower id, and two CVE ids are refused. |
asn_assigned.1 |
asn |
value 0 is rejected: AS0 is reserved and never originates routes (RFC 7607). |
bucket_name_spelling.1 |
storage_bucket |
name is checked against the declared provider: length, grammar, and the prefixes, suffixes and substrings that provider reserves. |
cloud_account_spelling.1 |
cloud_account |
account_id must be the declared provider's spelling: 12 digits for aws, a project id of 6 to 30 characters starting with a letter for gcp, a lowercase UUID subscription id for azure. |
cloud_resource_hostname.1 |
cloud_resource |
hostname must match exactly one provider-assigned default hostname pattern, and that pattern's service must be service. An alias form is refused with a pointer to the canonical one; region, when sent, must equal the region the hostname encodes and is refused on a regionless form. |
contains_cidr_proper_subnet.1 |
contains_cidr |
The target network must be a proper subnet of the source, at the same IP version. |
contains_ip_member.1 |
contains_ip |
The target address must fall inside the source network, at the same IP version. |
cpe_product_level.1 |
technology |
A cpe on a technology must leave the version attribute * or -: the node is shared by every host, so a versioned CPE belongs on the runs_technology edge beside version. |
dns_name_kind.1 |
domain, subdomain |
value must classify as this type against the bundled PSL: a registrable domain for domain, a name below one for subdomain. |
has_contact_endpoint_role.1 |
has_contact |
An endpoint target requires role iodef and method POST (RFC 6546), and iodef never targets a phone: a CAA iodef names a mailto address or an https report URL. |
has_contact_registration_roles.2 |
has_contact |
From a whois_registration, role must be registrant, admin, tech or billing; from a domain or subdomain, those four roles are refused, because they belong to one registration. From a package, role must be maintainer or security and the target an email_address; maintainer is refused from every other source. |
has_registration_suffix_match.1 |
has_registration |
The registration's registry must be the zone of its domain: the domain's value without its first label. |
has_subdomain_suffix.1 |
has_subdomain |
The target's value must end in . plus the source's value. |
http_fingerprint_value_kind.1 |
http_fingerprint |
favicon_mmh3 requires the signed 32-bit integer spelling; body_sha256 and header_sha256 require 64 lowercase hex characters. |
in_account_provider_match.2 |
in_account |
The account's provider must be the source's provider: the prefix of a cloud resource's service, the provider behind a bucket's provider, or the cloud registry host in an oci purl's repository_url: ECR (dkr.ecr.<region>.amazonaws.com(.cn) or public.ecr.aws) to aws, Artifact Registry and gcr.io to gcp, azurecr.io to azure. Any other registry and any non-oci package belong to no account. |
ip_address_version.1 |
ip_address |
version must equal the version of the address in value. |
ip_cidr_version.1 |
ip_cidr |
version must equal the version of the network in value. |
port_number_assigned.1 |
port |
number 0 is rejected: it is what a tool emits for a missing port, and no service listens there. The uint16 format keeps 0 because SRV and MX values may legitimately be 0. |
registrar_iana_assigned.1 |
registrar |
iana_id must be at least 1, because 0 is what an agent emits for a missing field. |
registry_domain_id_assigned.1 |
whois_registration |
registry_domain_id is rejected when its part before the last hyphen is all zeros or a redaction word such as REDACTED, NONE, NA, UNKNOWN, PRIVATE, WITHHELD or NOTDISCLOSED, in any case. |
repository_owner_spelling.1 |
repository |
owner is checked against the grammar and length of the declared platform, and only gitlab accepts a / for nested groups. |
secret_plaintext_keys.1 |
secret, authenticates, exposes_secret |
The record is rejected if any key at any depth, in any case, is value, secret, plaintext, password, token, key, credential, match, raw, rawv2, redacted or line, so the credential itself cannot reach storage. |
service_secure_flag.1 |
service |
A TLS-capable registry entry, such as http, additionally requires a boolean secure. |
tenant_id_spelling.1 |
identity_tenant |
entra_id requires a canonical lowercase UUID; okta requires the bare organization slug, so a dot is rejected. |
tls_fingerprint_length.1 |
tls_fingerprint |
value must be 62 characters for jarm and 32 for ja3s. |
txt_record_diversion.1 |
txt_record |
A value that the dedicated type for its version tag accepts is rejected here: v=spf1 belongs to spf_record, v=DMARC1 to dmarc_record, v=DKIM1 to dkim_record and v=STSv1 to mta_sts_policy. A malformed tagged value, such as v=spf1include:..., stays a txt_record. |
Canonicalizations¶
Each rewrites a declared non-canonical spelling in place before validation, identity and storage.
| Canonicalization | Types | Rewrite |
|---|---|---|
caa_parameter_name_fold.1 |
caa_issue, caa_issuewild |
ASCII parameter names are lowercased, because RFC 8659 tags are case-insensitive while the parameter list is identity-bearing. A non-ASCII name is left for validation to reject. |
endpoint_url_drop_query.1 |
endpoint |
Once the whole url, query included, passes http_url, everything from its first ? is removed before hashing and storage, so one path is one endpoint. A URL whose query is malformed is left unchanged and rejected. |
Format rules¶
Every declared property that is not an enum names one of these rules. The version changes whenever what the rule accepts changes.
| Rule | Version | Accepted spelling |
|---|---|---|
advisory_id |
1 | A vulnerability id from a closed prefix list, spelled exactly as its database publishes it and never case-folded: CVE-, a 4-digit year and 4 to 19 digits; GHSA- and three --joined groups of four from 23456789cfghjmpqrvwx; or a PYSEC, RUSTSEC, GO, OSV, HSEC, JLSEC, OSEC, RSEC, EEF, DRUPAL or MAL id in the number shape that database issues. Vendor and distribution bulletins such as RHSA, DSA and USN are refused; write the CVE or GHSA they cite. |
alpn_tokens |
1 | An array of zero or more ASCII tokens matching [A-Za-z0-9./_-]{1,255}; order is not identity-significant and duplicates are preserved. |
asn |
1 | A strict JSON integer from 0 through 4294967295. |
boolean |
1 | A strict JSON true or false; the strings "true" and "1" and the number 1 are rejected. |
breach_token_or_empty |
1 | The empty string, or <corpus>:<id>: a lowercase tech_token naming the breach corpus, a colon, and 1 to 200 lowercase characters from letters, digits and ._/-, such as hibp:linkedin or leakcheck:linkedin.com. Slug a display name: lowercase, runs of other characters become one -. |
bucket_name |
1 | The provider-global name of an object-storage bucket: 3 to 222 lowercase ASCII characters from letters, digits, hyphen, underscore and dot, starting and ending alphanumeric, without a doubled dot, and never a dotted-quad IPv4 address. Every provider is stricter than this union rule, and the declared provider fixes which of the narrower spellings is accepted. |
caa_parameters |
1 | An array of objects with name and value strings. Names start alphanumeric and continue alphanumeric or hyphen. Values are empty or use ASCII 0x21-0x3A and 0x3C-0x7E. |
calendar_date |
1 | A calendar date YYYY-MM-DD that exists, without a time or zone. |
cidr |
1 | Canonical strict IPv4 or IPv6 network with an explicit prefix length. |
cloud_account_id |
1 | 1 to 64 lowercase ASCII letters, digits and hyphens, starting and ending alphanumeric. The declared provider fixes the spelling: 12 digits for AWS, a project id for GCP, a lowercase UUID for Azure. |
cloud_region |
1 | 1 to 32 lowercase ASCII letters, digits and hyphens, starting and ending alphanumeric. |
cpe23 |
1 | A lowercase CPE 2.3 formatted string (NIST IR 7695) of at most 512 characters: 'cpe:2.3:', the part, and ten colon-separated attributes, each '', '-', or an escaped value optionally anchored by '' or a run of '?'. The legacy 'cpe:/' URI binding that nmap prints is rejected; convert it. |
credential_key_id |
1 | 1 to 128 characters from ASCII letters, digits and ._:/+=-: the public identifier half of a two-part credential, such as an AWS access key id, never secret material. |
cvss_score |
1 | A strict JSON number from 0 through 10 with at most one decimal place, as CVSS publishes a score: 9.8 and 10 are accepted, 9.85 and "9.8" are not. |
cvss_vector |
1 | A CVSS vector string with its version prefix, CVSS:3.0/, CVSS:3.1/ or CVSS:4.0/, then /-separated METRIC:value pairs, each metric once and every base metric of that version present. The unprefixed CVSS 2 form is rejected. |
cwe |
1 | A string matching CWE-[0-9]{1,6} exactly, uppercase as MITRE publishes it. |
dkim_selector |
1 | A lowercase ASCII DKIM selector of at most 253 bytes, as one or more dot-separated labels of at most 63 bytes each, written without the _domainkey suffix or the domain. In practice it is far shorter, since <selector>._domainkey.<domain> must itself fit in 253 bytes. |
dmarc |
1 | Printable ASCII of at most 4096 characters beginning with 'v=DMARC1' followed by a semicolon, a normal space, or end of text. |
dns_name |
1 | A lowercase ASCII domain or subdomain spelling classified by the bundled ICANN PSL; at least two labels, labels at most 63 bytes, total at most 253 bytes, and no trailing dot. |
dns_or_explicit_empty |
1 | dns_name or the explicit empty string for no SNI offer; IP literals are rejected. |
email_address |
1 | A lowercase ASCII mailbox of at most 254 characters: an RFC 5322 dot-atom local part of at most 64 characters, one @, and a domain that satisfies dns_name. Quoted local parts, address literals and display names are rejected. A local part is case-sensitive on the wire; this rule requires the lowercase spelling anyway, so one mailbox is one node. |
epp_status_list |
1 | A non-empty array of EPP domain status codes in their camelCase spelling, from RFC 5731 and the RFC 3915 grace periods, sorted ascending with no duplicate. Convert RDAP's spaced words: client transfer prohibited is clientTransferProhibited, active is ok. |
finding_matcher_or_empty |
1 | The empty string, or 1 to 400 characters from ASCII letters, digits and ._:/-: the reporting tool's sub-rule discriminator, such as a nuclei matcher name or <host>:<matcher> for a TLS result. |
finding_rule |
1 | <tool>:<id>: a lowercase tech_token naming the reporting tool, a colon, and 1 to 200 characters from ASCII letters, digits and ._/- spelling the tool's own rule id, such as nuclei:http-missing-security-headers or manual:exposed-admin-panel. |
git_ref_name |
1 | A branch name as git check-ref-format --branch accepts it, one level allowed: at most 255 ASCII characters, no space, control character or any of ~^:?*[\, no .., @{ or //, no component starting with . or ending .lock, and not @, HEAD or a leading -. |
hex_serial |
1 | A certificate serial number as 1 to 40 lowercase hexadecimal digits without leading zeros or separators: tlsx's AB:CD:... becomes abcd.... |
html_token |
1 | An HTML element or attribute name: a lowercase letter, then up to 31 letters, digits or hyphens. |
html_token_or_empty |
1 | The empty string, or an html_token. |
http_fingerprint_value |
1 | Either a signed 32-bit decimal integer written in ASCII without a leading zero or a plus sign, for a MurmurHash3 favicon hash, or exactly 64 lowercase hexadecimal characters for a response digest. The declared kind fixes which one is accepted. |
http_status |
1 | A strict JSON integer HTTP status code from 100 through 599. |
http_url |
1 | Canonical absolute ASCII http/https URL with a lowercase host (underscore labels are accepted left of the registrable domain, as for subdomain), mandatory path, no userinfo, fragment, whitespace, backslash, Unicode, default explicit port, dot path segment, or lowercase percent escape. A submitted query string is validated with the rest of the URL and then removed before identity and storage, so one endpoint holds one path; parameter names belong to parameter nodes. |
ip |
1 | Canonical IPv4Address.compressed or lowercase IPv6Address.compressed spelling, without scope or prefix. An IPv4-mapped IPv6 address (::ffff:192.0.2.1) is rejected: write the IPv4 address. |
ip_version |
1 | A strict JSON integer equal to 4 or 6. |
iso3166_alpha2 |
1 | Two uppercase ASCII letters in the ISO 3166-1 alpha-2 shape, as registries publish a country: US, DE. Shape only; membership in the ISO list is not checked. |
media_type |
1 | A lowercase media type essence type/subtype of RFC 6838 restricted names, without parameters: text/html, never text/html; charset=utf-8 or Text/HTML. |
method |
1 | One to 32 characters matching an uppercase HTTP method token. |
mta_sts |
1 | Printable ASCII of at most 4096 characters beginning with 'v=STSv1' followed by a semicolon, a normal space, or end of text: the TXT record at _mta-sts.<domain>, not the policy file body. |
multiline_text_4096 |
1 | 1 to 4096 printable Unicode characters, newlines and tabs included. |
mx_pattern_list |
1 | An array of RFC 8461 mx patterns, each a lowercase dns_name or *. followed by one, sorted ascending with no duplicate, so one policy has one spelling. |
package_purl |
1 | A versionless purl of at most 512 characters, pkg:<type>/<namespace>/<name> for npm, pypi, maven, nuget, gem, cargo, golang, composer or oci, canonical, not rewritten: npm name as published, scope %40acme; PyPA-normalized PyPI name; lowercase NuGet id, crate (_ not -); namespaced maven, composer, golang. No version, subpath or qualifier but oci's required repository_url: unencoded host[:port]/path ending in the name; Docker Hub as docker.io, official images in library/; ECR as <account>.dkr.ecr.<region>.amazonaws.com(.cn), no FIPS/dual-stack alias. Write docker as oci. |
parameter_name |
1 | 1 to 128 printable ASCII characters without space, &, =, or #; one single parameter name, never a raw query string. |
partial_date |
1 | YYYY, YYYY-MM or YYYY-MM-DD, a date known only to the precision the source gives. |
phone_e164 |
1 | An E.164 number: +, a leading digit from 1 through 9, and in total 2 to 15 digits. |
printable_text_1024 |
1 | A string of 1-1024 printable Unicode characters. |
printable_text_200 |
1 | A string of 1-200 printable Unicode characters. |
probability |
1 | A strict JSON number from 0 through 1, such as an EPSS score or percentile. |
public_suffix |
1 | A lowercase ASCII zone under which names are registered, per the bundled ICANN PSL: one more label makes a registrable domain, so com and co.uk qualify and example.com does not. |
redirect_status |
1 | A strict JSON integer in 301, 302, 303, 307, or 308. |
registry_domain_id |
1 | An RFC 5730 repository object id in ASCII, as the registry publishes it in the RDAP handle or the WHOIS Registry Domain ID: 1-80 letters, digits or underscores, a hyphen, and a 1-8 character alphanumeric repository suffix, such as 2138514_DOMAIN_COM-VRSN. Case is preserved. |
repo_name |
1 | A 1-100 character lowercase ASCII repository name from letters, digits, dot, underscore and hyphen, holding at least one alphanumeric character and never the reserved . or ... Hosting platforms resolve names case-insensitively, so the lowercase spelling keeps one repository one node. |
repo_owner |
1 | A 1-255 character lowercase ASCII owner path of one or more /-separated segments, each 1-100 characters from letters, digits, dot, underscore and hyphen and each starting and ending alphanumeric. The separator exists for nested GitLab groups; the declared platform fixes whether more than one segment is accepted. |
rir_handle |
1 | A regional-registry object handle of 2 to 64 ASCII characters, starting and ending alphanumeric and continuing alphanumeric or hyphen. Handles are case-sensitive and stored exactly as the registry publishes them: RIPE and AFRINIC preserve the organisation name's case (ORG-nG51-RIPE), so never uppercase one. Handles are unique within one registry, never across registries. |
service_name |
1 | A member of the bundled versioned service name whitelist. |
sha256 |
1 | Exactly 64 lowercase ASCII hexadecimal characters. |
spf |
1 | Printable ASCII of at most 4096 characters beginning with v=spf1 followed by a normal space or end of text, the same bound as every other TXT value rule. |
srv_label |
1 | A 2-63 byte lowercase ASCII SRV label beginning with underscore. |
tag_list |
1 | A non-empty array of tech_token tags, lowercase, sorted ascending with no duplicate, so one tag set has one spelling. |
tech_token |
1 | A 1-63 character lowercase ASCII technology slug that starts and ends alphanumeric and may contain interior dot, underscore, plus, or hyphen. |
tech_version |
1 | 1 to 64 printable ASCII characters without space: a version string as the product reports it. |
tenant_id |
1 | A 1-128 character lowercase ASCII identity-tenant identifier that starts and ends alphanumeric and may contain interior dot, underscore or hyphen. The declared provider fixes the narrower spelling: a canonical lowercase UUID for Entra ID, a bare organization slug for Okta. |
tls_cipher_name |
1 | The spelling of an IANA TLS cipher suite name: 5 to 128 uppercase ASCII characters beginning 'TLS_', with underscore-separated alphanumeric components. Shape only; membership in the IANA registry is not checked. |
tls_fingerprint_value |
1 | Exactly 32 lowercase hexadecimal characters for a JA3S MD5 digest, or exactly 62 for a JARM fingerprint. The declared kind fixes which length is accepted. |
txt_value |
1 | 1 to 4096 printable ASCII characters, the concatenated and unquoted character-strings of one TXT RRset. |
uint16 |
1 | A strict JSON integer from 0 through 65535. |
uint32 |
1 | A strict JSON integer from 0 through 4294967295. |
uint63 |
1 | A strict JSON integer from 0 through 9223372036854775807. |
uint8 |
1 | A strict JSON integer from 0 through 255. |
username_or_empty |
1 | The empty string, or 1 to 256 printable ASCII characters without space: a login name exactly as the source spells it. |
utc_timestamp |
1 | An instant in UTC as YYYY-MM-DDTHH:MM:SSZ with an optional 1-6 digit fraction before the Z. Offsets are rejected, so one instant has one spelling and stored values sort and compare as text. |
Node type details¶
advisory¶
One published vulnerability record, identified by its CVE, GHSA or OSV ecosystem id and shared by every object it affects.
Not modeled: Not an observation that something is vulnerable; that is affected_by from the affected object. Not a vendor or distribution bulletin such as RHSA, DSA or USN, and not the affected products, version ranges, references or description, which stay in evidence. Never a finding source.
When the vulnerability has a known CVE, write the CVE id, even if a GHSA or OSV record is where it was found, so one vulnerability is one node. When a non-CVE advisory you wrote turns out to have a CVE, write the CVE advisory and link the two with aliases.
Identity: value
Parent scope: —
Inventory: none
Checks: advisory_cve_scores.1
Canonicalizations: —
| Property | Required | Rule | Meaning |
|---|---|---|---|
value |
yes | advisory_id |
The advisory id, spelled exactly as its database publishes it. |
cvss_score |
no | cvss_score |
The CVSS base score the advisory publishes, from its highest CVSS version. |
cvss_vector |
no | cvss_vector |
The CVSS vector string that score comes from. |
epss_percentile |
no | probability |
The EPSS score's percentile among all scored CVEs; CVE ids only. |
epss_score |
no | probability |
The FIRST EPSS probability of exploitation in the next 30 days; CVE ids only. |
kev_added |
no | calendar_date |
The date CISA added the CVE to its Known Exploited Vulnerabilities catalog; CVE ids only. |
published |
no | utc_timestamp |
When the advisory record was published. |
asn¶
An autonomous system number: the routing identity a network is announced from.
Not modeled: Not the organization holding it (organization through operated_by) and not the prefixes it announces (ip_cidr through announced_by).
Identity: value
Parent scope: —
Inventory: carries
Checks: asn_assigned.1
Canonicalizations: —
| Property | Required | Rule | Meaning |
|---|---|---|---|
value |
yes | asn |
The AS number as an integer, without the AS prefix. |
country |
no | iso3166_alpha2 |
The country the registry records for the AS. |
name |
no | printable_text_200 |
The holder's AS name as the registry or routing data publishes it; the latest write wins. |
rir |
no | one of arin, ripe, apnic, lacnic, afrinic |
The regional registry that assigned the AS. |
certificate¶
One X.509 certificate, identified by the SHA-256 of its DER encoding.
Not modeled: Not the handshake that presented it (presents_certificate from a service) and not the names it covers, which are covers_name edges.
A self edge through issued_by records a self-signed certificate. Absence of that edge means the issuer was never written, not that the chain ends.
Identity: der_sha256
Parent scope: —
Inventory: carries
Checks: —
Canonicalizations: —
| Property | Required | Rule | Meaning |
|---|---|---|---|
der_sha256 |
yes | sha256 |
Lowercase hex SHA-256 of the certificate's DER bytes. |
issuer_dn |
no | printable_text_1024 |
The issuer distinguished name as the scanner prints it. |
not_after |
no | utc_timestamp |
The end of the validity period. |
not_before |
no | utc_timestamp |
The start of the validity period. |
self_signed |
no | boolean |
True when the subject signed itself; keep it beside the issued_by self edge. |
serial |
no | hex_serial |
The serial number in lowercase hex without separators or leading zeros. |
subject_cn |
no | printable_text_1024 |
The subject common name. |
cloud_account¶
A provider tenancy container: an AWS account, a GCP project or an Azure subscription.
Not modeled: Not an identity-provider tenant (identity_tenant), a user or a billing profile.
Identity: provider, account_id
Parent scope: —
Inventory: carries
Checks: cloud_account_spelling.1
Canonicalizations: —
| Property | Required | Rule | Meaning |
|---|---|---|---|
account_id |
yes | cloud_account_id |
The provider's id: AWS account id, GCP project id or Azure subscription id. |
provider |
yes | one of aws, gcp, azure |
The cloud provider. |
cloud_resource¶
A provider-managed resource that answers at a provider-assigned default hostname, such as a CloudFront distribution, an App Service app or a Firebase site, keyed on that hostname.
Not modeled: Not the DNS name as such (subdomain), not object storage (storage_bucket) and not a path-addressed resource such as a Cloud Function, which is an endpoint.
Each accepted hostname names one resource at a time, so a takeover keeps the node and moves its in_account edge. Write a custom name or an alias host (dualstack., .scm., .firebaseapp.com, -dot- routes) as a subdomain reached through hosted_on. Cloud Run and project-level Cloud Functions hosts have no one-resource default hostname and are not modeled.
Identity: hostname
Parent scope: —
Inventory: carries
Checks: cloud_resource_hostname.1
Canonicalizations: —
| Property | Required | Rule | Meaning |
|---|---|---|---|
hostname |
yes | dns_name |
The canonical provider-assigned default hostname. |
service |
yes | one of aws_cloudfront, aws_api_gateway, aws_lambda_url, aws_elastic_beanstalk, aws_elb, azure_app_service, azure_cloud_service, azure_public_ip, azure_traffic_manager, azure_front_door, azure_api_management, gcp_app_engine, gcp_firebase_hosting, gcp_firebase_rtdb |
The provider service, fixed by which default hostname pattern matches. |
region |
no | cloud_region |
The region the hostname encodes, when it encodes one. |
cwe¶
A CWE weakness class: the canonical spelling that joins findings from different scanners.
Not modeled: Not a finding or an advisory; those reach it through has_weakness. Never a finding source.
Identity: value
Parent scope: —
Inventory: none
Checks: —
Canonicalizations: —
| Property | Required | Rule | Meaning |
|---|---|---|---|
value |
yes | cwe |
The CWE id as MITRE publishes it, such as CWE-79. |
name |
no | printable_text_200 |
MITRE's name for the weakness class, fed by the CWE catalog rather than a scanner. |
dkim_record¶
The DKIM key record one domain publishes for one selector, scoped through has_dkim_selector.
Not modeled: Not the <selector>._domainkey owner name as a subdomain node.
Writing the same selector again patches value in place, so the node is a current-state view; a rotated key survives only in evidence attached to the earlier write.
Identity: selector
Parent scope: has_dkim_selector (source)
Inventory: inherits
Checks: —
Canonicalizations: —
| Property | Required | Rule | Meaning |
|---|---|---|---|
selector |
yes | dkim_selector |
The selector labels, without ._domainkey or the domain. |
value |
yes | txt_value |
The normalized TXT value: unquoted, unescaped, with multi-string RRsets concatenated. |
dmarc_record¶
A DMARC policy value, shared by every name that publishes the same string.
Not modeled: Not the _dmarc owner name; has_dmarc attaches the record to the domain or subdomain itself.
Identity: value
Parent scope: —
Inventory: none
Checks: —
Canonicalizations: —
| Property | Required | Rule | Meaning |
|---|---|---|---|
value |
yes | dmarc |
The normalized TXT value beginning v=DMARC1. |
domain¶
A registrable domain name as the bundled public suffix list classifies it, such as example.co.uk.
Not modeled: Not a name below a registrable domain (subdomain) and not a public suffix. Registration dates, status and DNSSEC state belong to a whois_registration, not to the name.
Identity: value
Parent scope: —
Inventory: carries
Checks: dns_name_kind.1
Canonicalizations: —
| Property | Required | Rule | Meaning |
|---|---|---|---|
value |
yes | dns_name |
The lowercase ASCII name without a trailing dot; IDNs in punycode. |
wildcard |
no | boolean |
True when random labels directly under this name resolve, a DNS wildcard. |
email_address¶
A mailbox, reached as a contact through has_contact.
Not modeled: Not a person; person and company types are out of scope. Never a finding source.
Identity: value
Parent scope: —
Inventory: carries
Checks: —
Canonicalizations: —
| Property | Required | Rule | Meaning |
|---|---|---|---|
value |
yes | email_address |
The mailbox, lowercase including the local part. |
endpoint¶
One HTTP method on one URL path: the unit a crawler or scanner observes.
Not modeled: Not a query string or its values (parameter names are parameter nodes) and not the host or service that serves it.
Response digests are pivots on http_fingerprint nodes, not endpoint attributes. Raw response bodies and headers belong in evidence, where they are full-text indexed. Only the query is removed from url: a secret carried in the path, such as a webhook token, stays in it.
Identity: url, method
Parent scope: —
Inventory: carries
Checks: —
Canonicalizations: endpoint_url_drop_query.1
| Property | Required | Rule | Meaning |
|---|---|---|---|
method |
yes | method |
The uppercase HTTP method token. |
url |
yes | http_url |
Absolute canonical http/https URL; a valid submitted query string is removed before identity. |
content_length |
no | uint63 |
The body length in bytes of the latest response. |
content_type |
no | media_type |
The media type essence of the latest response, without parameters. |
status |
no | http_status |
The status code of the latest response observed. |
title |
no | printable_text_1024 |
The HTML title of the latest response. |
webserver |
no | printable_text_200 |
The Server header value of the latest response. |
finding¶
One issue a scanner or analyst reports about one object, scoped to it through has_finding.
Not modeled: Not the weakness class (cwe) or a published advisory (advisory); those link through has_weakness and affected_by.
Identity is the rule and matcher under the parent, as nuclei deduplicates by template, matcher and target, so a renamed template patches title instead of forking. Send a distinct matcher for each result one rule reports on one parent; two results sharing "" overwrite each other. unknown severity means none was assigned and is not ordinal: never sort or filter it as below info.
Identity: rule, matcher
Parent scope: has_finding (source)
Inventory: inherits
Checks: —
Canonicalizations: —
| Property | Required | Rule | Meaning |
|---|---|---|---|
matcher |
yes | finding_matcher_or_empty |
The sub-rule discriminator, such as a matcher name, or empty when the rule has one result. |
rule |
yes | finding_rule |
The reporting tool and its rule id, such as a nuclei template id. |
severity |
yes | one of info, low, medium, high, critical, unknown |
The reporter's severity; the latest write wins. |
title |
yes | printable_text_200 |
The rule's human-readable name; the latest write wins. |
confidence |
no | one of unknown, low, medium, high, confirmed |
How sure the reporter is, in BBOT's scale. |
cvss_score |
no | cvss_score |
The CVSS score the reporter assigns. |
cvss_vector |
no | cvss_vector |
The CVSS vector the reporter assigns. |
description |
no | multiline_text_4096 |
The reporter's description, never one that embeds a secret. |
scanner |
no | tech_token |
The tool that reported it, when rule names a wrapped tool. |
tags |
no | tag_list |
The rule's tags, lowercase, sorted. |
host_key¶
An SSH host public key, shared by every service that presents it.
Not modeled: Not a host. Two hosts presenting one key are a cloned image or one machine at two addresses, which makes this a correlation pivot. Never a finding source.
Identity: algorithm, fingerprint_sha256
Parent scope: —
Inventory: carries
Checks: —
Canonicalizations: —
| Property | Required | Rule | Meaning |
|---|---|---|---|
algorithm |
yes | one of ssh-rsa, ssh-dss, ssh-ed25519, ecdsa-sha2-nistp256, ecdsa-sha2-nistp384, ecdsa-sha2-nistp521, sk-ssh-ed25519@openssh.com, sk-ecdsa-sha2-nistp256@openssh.com |
The SSH public key algorithm name. |
fingerprint_sha256 |
yes | sha256 |
Lowercase hex SHA-256 of the raw public key blob, converted from OpenSSH's base64 SHA256: form. |
http_fingerprint¶
A response-side clustering pivot: a favicon hash or a body or header digest.
Not modeled: Not an identifier of a host or an owner; a shared default favicon or framework page is common. Never a finding source.
Identity: kind, value
Parent scope: —
Inventory: none
Checks: http_fingerprint_value_kind.1
Canonicalizations: —
| Property | Required | Rule | Meaning |
|---|---|---|---|
kind |
yes | one of favicon_mmh3, body_sha256, header_sha256 |
Which fingerprint value holds. |
value |
yes | http_fingerprint_value |
Decimal signed 32-bit MurmurHash3 for favicon_mmh3, lowercase hex SHA-256 otherwise. |
identity_tenant¶
An identity-provider tenant, such as an Entra ID directory or an Okta organization.
Not modeled: Not a cloud billing account or subscription and not a user.
Identity: provider, tenant_id
Parent scope: —
Inventory: carries
Checks: tenant_id_spelling.1
Canonicalizations: —
| Property | Required | Rule | Meaning |
|---|---|---|---|
provider |
yes | one of entra_id, okta |
The identity provider; each member fixes one canonical tenant_id spelling. |
tenant_id |
yes | tenant_id |
The tenant identifier in the provider's canonical spelling. |
ip_address¶
One IPv4 or IPv6 address.
Not modeled: Not a network (ip_cidr) and not a name that resolves to it (resolves_to).
A range-list classification (cdncheck, httpx cdn_name) is an attribute of the address; a CDN or WAF seen in front of a name or service is a protected_by edge instead.
Identity: value
Parent scope: —
Inventory: carries
Checks: ip_address_version.1
Canonicalizations: —
| Property | Required | Rule | Meaning |
|---|---|---|---|
value |
yes | ip |
The canonical compressed address spelling. |
version |
yes | ip_version |
4 or 6, matching value. |
cdn_provider |
no | tech_token |
The CDN whose published ranges hold the address, such as cloudflare. |
cloud_provider |
no | tech_token |
The cloud provider whose published ranges hold the address, such as aws. |
waf_provider |
no | tech_token |
The WAF vendor whose published ranges hold the address. |
ip_cidr¶
One IPv4 or IPv6 network with an explicit prefix length, as allocated, announced or scanned.
Not modeled: Not a single address (ip_address) and not its holder (organization through operated_by).
Identity: value
Parent scope: —
Inventory: carries
Checks: ip_cidr_version.1
Canonicalizations: —
| Property | Required | Rule | Meaning |
|---|---|---|---|
value |
yes | cidr |
The canonical network spelling, host bits zero. |
version |
yes | ip_version |
4 or 6, matching value. |
country |
no | iso3166_alpha2 |
The country the registry records for the network. |
netname |
no | printable_text_200 |
The registry network name (RDAP name, WHOIS netname). |
rir |
no | one of arin, ripe, apnic, lacnic, afrinic |
The regional registry that allocated the network. |
mta_sts_policy¶
The MTA-STS TXT record a name publishes at _mta-sts.<name>, scoped through has_mta_sts_policy.
Not modeled: Not the policy file body served over HTTPS; its fields are attributes of this node.
Scoped because the TXT value is only a version pointer that unrelated tenants publish verbatim; unscoped, their policy attributes would overwrite each other.
Identity: value
Parent scope: has_mta_sts_policy (source)
Inventory: inherits
Checks: —
Canonicalizations: —
| Property | Required | Rule | Meaning |
|---|---|---|---|
value |
yes | mta_sts |
The TXT value beginning v=STSv1. |
max_age |
no | uint32 |
The policy file's max_age, in seconds. |
mode |
no | one of enforce, testing, none |
The policy file's mode. |
mx |
no | mx_pattern_list |
The policy file's mx patterns, sorted and without duplicates. |
organization¶
A number-resource holder known to a regional internet registry, keyed on the registry and handle.
Not modeled: Not a company in general and not a domain registrant; person and company types are out of scope.
Identity: registry, handle
Parent scope: —
Inventory: carries
Checks: —
Canonicalizations: —
| Property | Required | Rule | Meaning |
|---|---|---|---|
handle |
yes | rir_handle |
The RIR object handle, case preserved exactly as the registry publishes it. |
registry |
yes | one of arin, ripe, apnic, lacnic, afrinic |
The RIR that issued the handle. |
name |
no | printable_text_200 |
The organization's name as the registry publishes it; free text, so never identity. |
package¶
A package or container image the target publishes to a registry, keyed on its versionless purl, so every release of it is one node. An image keeps the registry repository it lives in.
Not modeled: Not a component the target runs or depends on: that is a technology reached through runs_technology, so a package is never a dependency. Not a release: versions, tags and digests stay in evidence and in a finding's matcher.
Write a package whose publisher is not yet attributed to the target as a candidate, and reject it with evidence once it proves to be someone else's. Which releases contain a secret or a vulnerability is recorded in evidence, never as a property or a node per version. A Go module path is written lowercased, as the purl spec requires: github.com/Azure/azure-sdk-for-go is pkg:golang/github.com/azure/azure-sdk-for-go. An oci registry host never carries the default port 443: docker.io:443 is written docker.io. An internal registry may be a dotted IPv4 address; localhost is refused.
Identity: purl
Parent scope: —
Inventory: carries
Allowed ownership: owned, candidate, rejected
Checks: —
Canonicalizations: —
| Property | Required | Rule | Meaning |
|---|---|---|---|
purl |
yes | package_purl |
The versionless purl in its canonical spelling; an oci purl keeps only repository_url. |
parameter¶
One named input of one endpoint, by name and location, scoped through has_parameter.
Not modeled: Not a value seen for the parameter; values are sample data for evidence.
Identity: name, location
Parent scope: has_parameter (source)
Inventory: inherits
Checks: —
Canonicalizations: —
| Property | Required | Rule | Meaning |
|---|---|---|---|
location |
yes | one of query, body, header, cookie, path |
Where the parameter travels in the request. |
name |
yes | parameter_name |
One parameter name, never a raw query string. |
phone¶
A telephone contact, reached through has_contact.
Not modeled: Not a person or a subscriber. Never a finding source.
Identity: value
Parent scope: —
Inventory: carries
Checks: —
Canonicalizations: —
| Property | Required | Rule | Meaning |
|---|---|---|---|
value |
yes | phone_e164 |
The E.164 number with its leading plus. |
port¶
One open transport port on one address, scoped to its ip_address through has_open_port.
Not modeled: Not a closed or filtered port: only open ports are written, and the scope edge is the state.
Identity: transport, number
Parent scope: has_open_port (source)
Inventory: inherits
Checks: port_number_assigned.1
Canonicalizations: —
| Property | Required | Rule | Meaning |
|---|---|---|---|
number |
yes | uint16 |
The port number. |
transport |
yes | one of tcp, udp, sctp |
The transport protocol. |
registrar¶
An ICANN-accredited registrar, keyed on its IANA registrar id.
Not modeled: Not a registry or a reseller. A registrar without an IANA id gets no node.
Identity: iana_id
Parent scope: —
Inventory: none
Checks: registrar_iana_assigned.1
Canonicalizations: —
| Property | Required | Rule | Meaning |
|---|---|---|---|
iana_id |
yes | uint16 |
The IANA registrar id. |
name |
yes | printable_text_200 |
The registrar's name; the latest write wins, because names change with renames and mergers. |
repository¶
A source-code repository on one hosting instance, keyed on the host, owner and name.
Not modeled: Not an organization or a person. owns_repository attributes it to a name and needs evidence.
Identity: host, owner, name
Parent scope: —
Inventory: carries
Checks: repository_owner_spelling.1
Canonicalizations: —
| Property | Required | Rule | Meaning |
|---|---|---|---|
host |
yes | dns_name |
The hosting instance's host name. |
name |
yes | repo_name |
The repository name, lowercase. |
owner |
yes | repo_owner |
The owner path, lowercase; only gitlab nests groups. |
platform |
yes | one of github, gitlab, bitbucket, gitea |
The hosting software, which selects the owner grammar; not identity. |
archived |
no | boolean |
Whether the repository is archived. |
default_branch |
no | git_ref_name |
The default branch name. |
fork |
no | boolean |
Whether the repository is a fork. |
visibility |
no | one of public, private, internal |
The platform's visibility setting. |
secret¶
One exposed credential, identified only by the SHA-256 of the secret so its occurrences join.
Not modeled: Never the secret itself: a node carrying a plaintext-bearing key is rejected.
Hash the secret part's UTF-8 bytes untrimmed: trufflehog Raw or the secret half of a two-part RawV2, gitleaks Secret (never Match), a leak corpus password or its published hash; in PEM, CRLF becomes LF. Compute it, then replace every secret field with [REDACTED] before ingesting the output as evidence. A password digest is unsalted and reversible by dictionary: treat the workspace as holding the passwords. Always send kind.
Identity: value_sha256
Parent scope: —
Inventory: carries
Checks: secret_plaintext_keys.1
Canonicalizations: —
| Property | Required | Rule | Meaning |
|---|---|---|---|
value_sha256 |
yes | sha256 |
Lowercase hex SHA-256 of the exact secret bytes. |
detector |
no | tech_token |
The scanner rule that found it, such as trufflehog's aws; not identity. |
key_id |
no | credential_key_id |
The public identifier half of a two-part credential, such as an AWS access key id. |
kind |
no | one of password, password_hash, api_key, access_token, private_key, session_token, connection_string, webhook_url, other |
What the secret is; send it whenever the source says, and other only when it cannot. |
verified |
no | boolean |
Whether the scanner confirmed the credential works; the latest write wins. |
service¶
The application protocol a port speaks, scoped to that port through has_service.
Not modeled: Not the product or version implementing it; that is runs_technology.
Identity: name
Parent scope: has_service (source)
Inventory: inherits
Checks: service_secure_flag.1
Canonicalizations: —
| Property | Required | Rule | Meaning |
|---|---|---|---|
name |
yes | service_name |
A member of the bundled Nmap-derived service-name registry. |
product |
no | printable_text_200 |
The product a version probe names, such as OpenSSH. |
secure |
no | boolean |
Whether the service runs over TLS; required for a TLS-capable name such as http. |
version |
no | tech_version |
The version a version probe reports. |
spf_record¶
An SPF policy value, shared by every name that publishes the same string.
Not modeled: Not the publishing name (has_spf) and not a malformed SPF-like value, which is a txt_record.
Identity: value
Parent scope: —
Inventory: none
Checks: —
Canonicalizations: —
| Property | Required | Rule | Meaning |
|---|---|---|---|
value |
yes | spf |
The normalized TXT value beginning v=spf1. |
storage_bucket¶
An object-storage bucket in a provider-global namespace.
Not modeled: Not an Azure container (the node is the storage account) and not a regional namespace such as DigitalOcean Spaces.
Identity: provider, name
Parent scope: —
Inventory: carries
Checks: bucket_name_spelling.1
Canonicalizations: —
| Property | Required | Rule | Meaning |
|---|---|---|---|
name |
yes | bucket_name |
The provider-global bucket name, or the Azure storage account name. |
provider |
yes | one of aws_s3, gcp_gcs, azure_blob |
The storage provider, whose naming rules the name must satisfy. |
subdomain¶
A DNS name below a registrable domain, such as api.example.com.
Not modeled: Not the registrable domain itself (domain).
Identity: value
Parent scope: —
Inventory: carries
Checks: dns_name_kind.1
Canonicalizations: —
| Property | Required | Rule | Meaning |
|---|---|---|---|
value |
yes | dns_name |
The lowercase ASCII name without a trailing dot; IDNs in punycode. |
wildcard |
no | boolean |
True when random labels directly under this name resolve, a DNS wildcard. |
wildcard_answer |
no | boolean |
True when this name's answer equals its parent wildcard's, so it may not exist. |
technology¶
A product, framework or service slug, shared by every host that runs it.
Not modeled: Not a per-host version, which belongs on runs_technology. Never a finding source.
The slug has no naming authority; use the product's Wappalyzer name lowercased with spaces as hyphens, and put the vendor's product-level CPE in cpe to anchor it.
Identity: name
Parent scope: —
Inventory: none
Checks: cpe_product_level.1
Canonicalizations: —
| Property | Required | Rule | Meaning |
|---|---|---|---|
name |
yes | tech_token |
The lowercase product slug. |
cpe |
no | cpe23 |
The product-level CPE 2.3 name, with the version attribute * or -. |
tls_cipher_suite¶
An IANA TLS cipher suite at one protocol version, shared by every service accepting it.
Not modeled: Not a negotiated session. Never a finding source.
Identity: version, name
Parent scope: —
Inventory: none
Checks: —
Canonicalizations: —
| Property | Required | Rule | Meaning |
|---|---|---|---|
name |
yes | tls_cipher_name |
The IANA cipher suite name. |
version |
yes | one of ssl30, tls10, tls11, tls12, tls13, dtls10, dtls12, dtls13 |
The protocol version the suite was offered at. |
tls_fingerprint¶
A TLS stack clustering pivot, JARM or JA3S, shared by every host behind one stack.
Not modeled: Not a host identifier: every host behind one load balancer presents the same JARM.
Identity: kind, value
Parent scope: —
Inventory: none
Checks: tls_fingerprint_length.1
Canonicalizations: —
| Property | Required | Rule | Meaning |
|---|---|---|---|
kind |
yes | one of jarm, ja3s |
Which fingerprint value holds. |
value |
yes | tls_fingerprint_value |
The fingerprint: 62 characters for JARM, 32 for JA3S. |
txt_record¶
A generic TXT value a name publishes, when no dedicated type accepts it.
Not modeled: Not an SPF, DMARC, DKIM or MTA-STS value its dedicated type accepts, and never an ephemeral _acme-challenge value.
Identity: value
Parent scope: —
Inventory: none
Checks: txt_record_diversion.1
Canonicalizations: —
| Property | Required | Rule | Meaning |
|---|---|---|---|
value |
yes | txt_value |
The normalized TXT value. |
whois_registration¶
One registry-level registration of a registrable domain, known by the repository object id the registry assigns (RDAP handle, WHOIS Registry Domain ID) and scoped through has_registration.
Not modeled: Not the domain name, which outlives registrations; not the registrant, since person and company types are out of scope; and not a WHOIS or RDAP response, which is evidence.
A drop and re-registration gets a new object id, so a new node, and the old one keeps its dates. When the registry publishes no id, or only a redaction placeholder, write no registration: keep the response as evidence on the domain and never invent a key.
Identity: registry, registry_domain_id
Parent scope: has_registration (source)
Inventory: inherits
Checks: registry_domain_id_assigned.1
Canonicalizations: —
| Property | Required | Rule | Meaning |
|---|---|---|---|
registry |
yes | public_suffix |
The zone the name is registered in, such as com or co.uk: the domain without its first label. |
registry_domain_id |
yes | registry_domain_id |
The registry's repository object id for this registration, exactly as published. |
dnssec_signed |
no | boolean |
Whether the registry holds DS records for the name (RDAP delegationSigned). |
epp_status |
no | epp_status_list |
The EPP status codes the registry reports, sorted. |
registration_created |
no | utc_timestamp |
When the registration was created (RDAP registration event). |
registration_expires |
no | utc_timestamp |
When it expires unless renewed (RDAP expiration event). |
registration_updated |
no | utc_timestamp |
When the registry last changed it (RDAP last changed event). |
whois_server |
no | dns_name |
The registry's port-43 WHOIS server, never the registrar's. |
Relation type details¶
affected_by¶
The source is affected by the advisory: a vulnerable service, an endpoint a CVE template matched, a finding reporting it, or a published package with an affected release.
Not modeled: Not an advisory merely mentioned nearby; attach the evidence for the match.
When the vulnerability has a known CVE, write the CVE id as the target, even if a GHSA or OSV record is where it was found. An edge written before the CVE was known stays; link its advisory to the CVE with aliases rather than rewriting the edge.
Identity: —
Sources: service, finding, endpoint, package
Targets: advisory
Self edge: no
Checks: —
Canonicalizations: —
aliases¶
The two advisories name the same vulnerability, and the target is the id a pivot starts from.
Not modeled: Not a related or similar vulnerability, and not a bulletin that bundles CVEs. Never between two CVE ids, and never an advisory to itself.
One edge per pair, pointing toward the CVE: write the CVE id as the target, a GHSA as the target of an OSV database id, and between equal ranks the alphabetically higher id. An OSV record that aliases two CVEs links to each, so one id per vulnerability is a convention, not a guarantee.
Identity: —
Sources: advisory
Targets: advisory
Self edge: no
Checks: aliases_toward_cve.1
Canonicalizations: —
announced_by¶
The network is announced in BGP by the AS.
Not modeled: Not the holder of the network; that is operated_by.
Identity: —
Sources: ip_cidr
Targets: asn
Self edge: no
Checks: —
Canonicalizations: —
authenticates¶
The secret is a credential for the principal: a mailbox, account, tenant, repository, service, endpoint, bucket or cloud resource, optionally for one login name and one breach.
Not modeled: Not a person. Never the secret itself: plaintext-bearing keys are refused, and the secret node holds only its digest.
Identity is (username, breach), so one pair exposed in two breaches is two edges. The breach token joins spellings within one corpus only; across corpora the same breach stays two tokens. Send "" for a value the source does not give, never a guess. Link evidence only after replacing every secret-bearing field with [REDACTED].
Identity: username, breach
Sources: secret
Targets: email_address, cloud_account, identity_tenant, repository, service, endpoint, storage_bucket, cloud_resource
Self edge: no
Checks: secret_plaintext_keys.1
Canonicalizations: —
| Property | Required | Rule | Meaning |
|---|---|---|---|
breach |
yes | breach_token_or_empty |
The corpus and breach id the pair was published in, or empty for a live scanner hit. |
username |
yes | username_or_empty |
The login name the credential is for, as the source spells it, or empty. |
breach_date |
no | partial_date |
When the breach happened, to the precision the corpus gives. |
breach_title |
no | printable_text_200 |
The corpus's display name for the breach; the latest write wins. |
verified |
no | boolean |
Whether the pair was confirmed to work. |
backed_by_bucket¶
A name or URL serves content from the bucket.
Not modeled: Not a bucket found only by guessing names; write that bucket node with its evidence instead.
Identity: —
Sources: domain, subdomain, endpoint
Targets: storage_bucket
Self edge: no
Checks: —
Canonicalizations: —
caa_issue¶
A CAA issue property at the source name authorizes the issuer domain named by the target.
Not modeled: Not a wildcard authorization (caa_issuewild) and not an iodef reporting address.
Identity: flags, parameters, with parameters hashed order-independently
Sources: domain, subdomain
Targets: domain, subdomain
Self edge: yes
Checks: —
Canonicalizations: caa_parameter_name_fold.1
| Property | Required | Rule | Meaning |
|---|---|---|---|
flags |
yes | uint8 |
The CAA flags octet. |
parameters |
yes | caa_parameters |
The property's parameters; names are lowercased and the list is hashed order-independently. |
caa_issuewild¶
A CAA issuewild property at the source name authorizes the target issuer for wildcard names.
Not modeled: Not a non-wildcard authorization (caa_issue).
Identity: flags, parameters, with parameters hashed order-independently
Sources: domain, subdomain
Targets: domain, subdomain
Self edge: yes
Checks: —
Canonicalizations: caa_parameter_name_fold.1
| Property | Required | Rule | Meaning |
|---|---|---|---|
flags |
yes | uint8 |
The CAA flags octet. |
parameters |
yes | caa_parameters |
The property's parameters; names are lowercased and the list is hashed order-independently. |
cname_to¶
A CNAME record at the source name points to the target name.
Not modeled: Not resolution to an address (resolves_to) and not a subtree redirect (dname_to).
Identity: —
Sources: domain, subdomain
Targets: domain, subdomain
Self edge: yes
Checks: —
Canonicalizations: —
contains_cidr¶
The source network properly contains the target network.
Not modeled: Not an allocation or announcement fact; containment is arithmetic, checked on write.
Identity: —
Sources: ip_cidr
Targets: ip_cidr
Self edge: no
Checks: contains_cidr_proper_subnet.1
Canonicalizations: —
contains_ip¶
The source network contains the target address.
Not modeled: Not a claim that the address is in use; containment is arithmetic, checked on write.
Identity: —
Sources: ip_cidr
Targets: ip_address
Self edge: no
Checks: contains_ip_member.1
Canonicalizations: —
covers_name¶
The certificate covers the target name, literally or through a wildcard SAN.
Not modeled: Not a name the certificate was merely presented for; that is presents_certificate.
Identity: coverage
Sources: certificate
Targets: domain, subdomain
Self edge: no
Checks: —
Canonicalizations: —
| Property | Required | Rule | Meaning |
|---|---|---|---|
coverage |
yes | one of exact, wildcard |
exact for a literal SAN, wildcard when a *. SAN covers the target base name. |
dname_to¶
A DNAME record at the source name redirects its whole subtree to the target.
Not modeled: Not a single-name alias (cname_to).
Identity: —
Sources: domain, subdomain
Targets: domain, subdomain
Self edge: yes
Checks: —
Canonicalizations: —
exposes_secret¶
The source exposes the secret at one location.
Not modeled: Never the secret itself; the node holds only its digest, and plaintext-bearing keys are refused.
Link evidence only after replacing every secret-bearing scanner field with [REDACTED]. From a package, the evidence names the releases that ship the secret.
Identity: location
Sources: repository, endpoint, storage_bucket, cloud_resource, package
Targets: secret
Self edge: no
Checks: secret_plaintext_keys.1
Canonicalizations: —
| Property | Required | Rule | Meaning |
|---|---|---|---|
location |
yes | printable_text_1024 |
Where the secret appears, such as a file path or URL path; identity-bearing. |
federates_with¶
The name signs users in through the identity tenant.
Not modeled: Not ownership of the tenant by the name's registrant.
Identity: —
Sources: domain, subdomain
Targets: identity_tenant
Self edge: no
Checks: —
Canonicalizations: —
| Property | Required | Rule | Meaning |
|---|---|---|---|
namespace_type |
no | one of managed, federated |
How the realm lookup classifies the name: managed or federated. |
has_contact¶
The source publishes the contact for one role, including a CAA iodef report address or URL.
Not modeled: Not a person record; person and company types are out of scope.
Use published for an address harvested from an organization's own surface with no declared role. Registrant, admin, tech and billing contacts come from registration data and attach to the whois_registration, so a re-registration does not inherit them. A package lists only maintainer and security email addresses, and only a package has a maintainer.
Identity: role
Sources: organization, registrar, domain, subdomain, repository, whois_registration, package
Targets: email_address, phone, endpoint
Self edge: no
Checks: has_contact_registration_roles.2, has_contact_endpoint_role.1
Canonicalizations: —
| Property | Required | Rule | Meaning |
|---|---|---|---|
role |
yes | one of abuse, admin, tech, registrant, billing, noc, security, published, iodef, maintainer |
What the contact is for; identity-bearing, so one address may hold several roles. |
has_dkim_selector¶
The name publishes the DKIM selector; the scope relation of dkim_record.
Not modeled: Not a DNS delegation or subdomain relation.
Identity: —
Sources: domain, subdomain
Targets: dkim_record
Self edge: no
Checks: —
Canonicalizations: —
has_dmarc¶
The name publishes the DMARC record at _dmarc.<name>.
Not modeled: Not a _dmarc subdomain node.
Identity: —
Sources: domain, subdomain
Targets: dmarc_record
Self edge: no
Checks: —
Canonicalizations: —
has_finding¶
The finding is about the source object; the scope relation of finding.
Not modeled: Never from shared vocabulary such as a technology, fingerprint or advisory, which unrelated hosts share.
Identity: —
Sources: port, domain, subdomain, ip_address, ip_cidr, service, endpoint, certificate, parameter, dkim_record, storage_bucket, repository, identity_tenant, secret, mta_sts_policy, whois_registration, cloud_account, cloud_resource, package
Targets: finding
Self edge: no
Checks: —
Canonicalizations: —
has_http_fingerprint¶
The endpoint's response carries the fingerprint.
Not modeled: Not ownership: a shared fingerprint clusters, it does not attribute.
Identity: —
Sources: endpoint
Targets: http_fingerprint
Self edge: no
Checks: —
Canonicalizations: —
has_mail_exchange¶
An MX record at the source names the target as a mail exchanger.
Not modeled: Not an address record; resolve the exchanger separately.
Identity: preference
Sources: domain, subdomain
Targets: domain, subdomain
Self edge: yes
Checks: —
Canonicalizations: —
| Property | Required | Rule | Meaning |
|---|---|---|---|
preference |
yes | uint16 |
The MX preference; identity-bearing. |
has_mta_sts_policy¶
The name publishes the MTA-STS policy record; its scope relation.
Not modeled: Not an _mta-sts subdomain node.
Identity: —
Sources: domain, subdomain
Targets: mta_sts_policy
Self edge: no
Checks: —
Canonicalizations: —
has_nameserver¶
An NS record at the source delegates it to the target name server.
Not modeled: Not the SOA primary (has_soa_primary).
Identity: —
Sources: domain, subdomain
Targets: domain, subdomain
Self edge: yes
Checks: —
Canonicalizations: —
has_open_port¶
The address has the port open; the scope relation of port.
Not modeled: Not a closed or filtered port.
Identity: —
Sources: ip_address
Targets: port
Self edge: no
Checks: —
Canonicalizations: —
has_parameter¶
The endpoint accepts the parameter; the scope relation of parameter.
Not modeled: Not a parameter value.
Identity: —
Sources: endpoint
Targets: parameter
Self edge: no
Checks: —
Canonicalizations: —
has_registration¶
The domain has this registration; the scope relation of whois_registration.
Not modeled: Not a registrar relationship, which is registered_through from the registration.
Identity: —
Sources: domain
Targets: whois_registration
Self edge: no
Checks: has_registration_suffix_match.1
Canonicalizations: —
has_service¶
The port speaks the service; the scope relation of service.
Not modeled: Not the product implementing it (runs_technology).
Identity: —
Sources: port
Targets: service
Self edge: no
Checks: —
Canonicalizations: —
has_soa_primary¶
The SOA record at the source names the target as its primary name server.
Not modeled: Not an NS delegation (has_nameserver).
Identity: —
Sources: domain, subdomain
Targets: domain, subdomain
Self edge: yes
Checks: —
Canonicalizations: —
has_spf¶
The name publishes the SPF record.
Not modeled: Not a malformed SPF-like TXT value (has_txt_record).
Identity: —
Sources: domain, subdomain
Targets: spf_record
Self edge: no
Checks: —
Canonicalizations: —
has_srv_target¶
An SRV record at the source names the target host for a service.
Not modeled: Not an open port observation; the SRV port is what the record publishes.
Identity: service, protocol, port, priority, weight
Sources: domain, subdomain
Targets: domain, subdomain
Self edge: yes
Checks: —
Canonicalizations: —
| Property | Required | Rule | Meaning |
|---|---|---|---|
port |
yes | uint16 |
The published target port. |
priority |
yes | uint16 |
The SRV priority. |
protocol |
yes | srv_label |
The SRV protocol label, with its underscore. |
service |
yes | srv_label |
The SRV service label, with its underscore. |
weight |
yes | uint16 |
The SRV weight. |
has_subdomain¶
The target name lies below the source name.
Not modeled: Not a DNS delegation; the relation is naming structure, checked on write.
Identity: —
Sources: domain, subdomain
Targets: subdomain
Self edge: no
Checks: has_subdomain_suffix.1
Canonicalizations: —
has_svcb_binding¶
An HTTPS or SVCB record at the source binds it to the target, which may be the owner itself.
Not modeled: Never an AliasMode record whose target is ., the wire's negative answer.
Write it only after parsing SvcParams: alpn: [] asserts the record carries no ALPN parameter.
Identity: record_type, priority, alpn, with alpn hashed order-independently
Sources: domain, subdomain
Targets: domain, subdomain
Self edge: yes
Checks: —
Canonicalizations: —
| Property | Required | Rule | Meaning |
|---|---|---|---|
alpn |
yes | alpn_tokens |
ALPN ids from SvcParams, hashed order-independently. |
priority |
yes | uint16 |
The SvcPriority; 0 is AliasMode. |
record_type |
yes | one of https, svcb |
Whether the record is HTTPS or SVCB. |
has_tls_fingerprint¶
The service's TLS stack has the fingerprint.
Not modeled: Not a host identity: a shared fingerprint clusters stacks.
Identity: —
Sources: service
Targets: tls_fingerprint
Self edge: no
Checks: —
Canonicalizations: —
has_txt_record¶
The name publishes the TXT value.
Not modeled: Not a value that belongs to a dedicated TXT type.
Identity: —
Sources: domain, subdomain
Targets: txt_record
Self edge: no
Checks: —
Canonicalizations: —
has_weakness¶
The finding or advisory is an instance of the CWE weakness class.
Not modeled: Not a claim of exploitability.
Identity: —
Sources: finding, advisory
Targets: cwe
Self edge: no
Checks: —
Canonicalizations: —
hosted_on¶
A name or URL serves from the cloud resource, typically through a CNAME to its default hostname.
Not modeled: Not ownership of the resource; in_account records whose account it is.
Identity: —
Sources: domain, subdomain, endpoint
Targets: cloud_resource
Self edge: no
Checks: —
Canonicalizations: —
in_account¶
The cloud resource, bucket or container image belongs to the account.
Not modeled: Not the account's identity provider, which is an identity_tenant.
An image belongs to an account only when its oci purl names a cloud provider's registry: an ECR image to the AWS account its <account>.dkr.ecr.<region>.amazonaws.com(.cn) host names, an Artifact Registry or gcr.io image to its GCP project, an ACR image to its Azure subscription. A Docker Hub or GHCR image has no account.
Identity: —
Sources: cloud_resource, storage_bucket, package
Targets: cloud_account
Self edge: no
Checks: in_account_provider_match.2
Canonicalizations: —
issued_by¶
The certificate was issued by the target certificate; a self edge marks a self-signed one.
Not modeled: Not trust-store validation, which depends on the observer.
Identity: —
Sources: certificate
Targets: certificate
Self edge: yes
Checks: —
Canonicalizations: —
links_to¶
The source page references the target URL, through one HTML element.
Not modeled: Not an HTTP redirect (redirects_to) and not a URL guessed by brute force.
Identity is element, so a script include and an anchor to one URL are two edges; attribute is last-writer-wins. Use "" when the crawler reports no element.
Identity: element
Sources: endpoint
Targets: endpoint
Self edge: yes
Checks: —
Canonicalizations: —
| Property | Required | Rule | Meaning |
|---|---|---|---|
element |
yes | html_token_or_empty |
The referencing HTML element, such as a or script, or empty. |
attribute |
no | html_token |
The attribute that held the URL, such as href or src. |
loads_package¶
The endpoint loads the target's own published package, such as a script bundle from npm.
Not modeled: Not a third-party component, which is a technology reached through runs_technology with its version. Not a release: the loaded version stays in evidence.
Identity: —
Sources: endpoint
Targets: package
Self edge: no
Checks: —
Canonicalizations: —
operated_by¶
The AS or network is held by the RIR organization.
Not modeled: Not domain registration, which has no RIR handle to key on.
Identity: —
Sources: asn, ip_cidr
Targets: organization
Self edge: no
Checks: —
Canonicalizations: —
owns_repository¶
The name's owner is attributed the repository.
Not modeled: Not proof of ownership: it is an attribution claim that needs evidence.
Identity: —
Sources: domain, subdomain
Targets: repository
Self edge: no
Checks: —
Canonicalizations: —
presents_certificate¶
The service presented the certificate in a handshake.
Not modeled: Not the names the certificate covers (covers_name).
Identity: mode, server_name, alpn_offered, with alpn_offered hashed order-independently
Sources: service
Targets: certificate
Self edge: no
Checks: —
Canonicalizations: —
| Property | Required | Rule | Meaning |
|---|---|---|---|
alpn_offered |
yes | alpn_tokens |
The ALPN ids offered, hashed order-independently. |
mode |
yes | one of tls, dtls, starttls, quic |
How TLS was reached on the service. |
server_name |
yes | dns_or_explicit_empty |
The SNI name offered, or empty when none was. |
name_mismatch |
no | boolean |
True when the certificate did not cover the name that was asked for. |
presents_host_key¶
The SSH service presented the host key.
Not modeled: Not a claim that two services are one host, though a shared key suggests it.
Identity: —
Sources: service
Targets: host_key
Self edge: no
Checks: —
Canonicalizations: —
protected_by¶
Traffic to the source passes through the technology acting as a WAF, CDN, reverse proxy or load balancer.
Not modeled: Not a range-list classification of an address, and not SaaS hosting (runs_technology).
Identity: kind
Sources: service, endpoint, domain, subdomain
Targets: technology
Self edge: no
Checks: —
Canonicalizations: —
| Property | Required | Rule | Meaning |
|---|---|---|---|
kind |
yes | one of waf, cdn, reverse_proxy, load_balancer |
The role the technology plays in front of the source. |
published_from¶
The package is built and published from the source repository.
Not modeled: Not a repository the package depends on or mirrors, and not attribution: owns_repository attributes the repository to a name.
Identity: —
Sources: package
Targets: repository
Self edge: no
Checks: —
Canonicalizations: —
redirects_to¶
The endpoint answered with an HTTP redirect to the target endpoint.
Not modeled: Not a client-side or meta refresh redirect.
Identity: status
Sources: endpoint
Targets: endpoint
Self edge: yes
Checks: —
Canonicalizations: —
| Property | Required | Rule | Meaning |
|---|---|---|---|
status |
yes | redirect_status |
The redirect status code; identity-bearing. |
registered_through¶
The registration is sponsored by the registrar.
Not modeled: Not a fact about the name across time: after a transfer or a re-registration, each registration keeps its own registrar edge.
Identity: —
Sources: whois_registration
Targets: registrar
Self edge: no
Checks: —
Canonicalizations: —
resolves_to¶
The name resolves to the address through an A or AAAA record.
Not modeled: Not a PTR record (reverse_resolves_to).
Identity: —
Sources: domain, subdomain
Targets: ip_address
Self edge: no
Checks: —
Canonicalizations: —
reverse_resolves_to¶
A PTR record for the address names the target.
Not modeled: Not forward resolution (resolves_to).
Identity: —
Sources: ip_address
Targets: domain, subdomain
Self edge: no
Checks: —
Canonicalizations: —
runs_technology¶
The source runs the technology, including a name pointing at a SaaS host.
Not modeled: Not a protective front such as a WAF or CDN (protected_by).
Identity: —
Sources: service, endpoint, domain, subdomain
Targets: technology
Self edge: no
Checks: —
Canonicalizations: —
| Property | Required | Rule | Meaning |
|---|---|---|---|
cpe |
no | cpe23 |
The versioned CPE 2.3 name for what this source runs. |
version |
no | tech_version |
The version this source runs, as the product reports it. |
serves_endpoint¶
The service serves the endpoint.
Not modeled: Not a redirect target (redirects_to).
Identity: —
Sources: service
Targets: endpoint
Self edge: no
Checks: —
Canonicalizations: —
supports_tls_cipher¶
The service accepts the cipher suite.
Not modeled: Not the suite negotiated in one session.
Identity: —
Sources: service
Targets: tls_cipher_suite
Self edge: no
Checks: —
Canonicalizations: —