Repository navigation
Releases
Releases · openctemio/contract
v1.6.0
Added: identity package (User-Agent rotation)
- New package
identity:CheckUserAgentandCheckUserAgents(1 to 256 printable ASCII characters, no line break, no leading or trailing space; at most 200 values, none twice),CheckKey,CanonicalHost, andSelectIndex/SelectUserAgent, the rule that picks one value of a rotation list per (scan run key, target host). - The choice is sticky (every request of a run to a host carries the same value, whatever the port, scheme or case) and spreads runs and hosts evenly (HMAC-SHA-256 keyed by the run key over a fixed label and the canonical host). The rule is versioned by its label; a test pins its output.
- Additive: no existing package changes.
v1.5.1
Fixed: release of 1.5.0
- The v1.5.0 tag points at a commit without its changelog section, so its release was not published. 1.5.1 has the same code; use 1.5.1.
v1.4.0
Changed: service detection is routed
detect.services@1goes from planned to routed (tier 1, phasediscover.active, still major 1). Credential-free handshakes on known open ports only: the server's first bytes, protocol greetings and a TLS handshake, never a login, bind or state-changing command, never a range. Params:ports(port_list filter),transports(tcp,udp; tcp when unset, udp is opt-in),depth(fast,thorough; fast when unset),rate(1-1000 services per second),timeout_ms(100-10000). Outputs unchanged: aserviceasset withvalueand an application protocol or a product.
v1.3.1
Security: webpath deny paths hold for every spelling a server reads
Deniedreads a deny path both as written and percent-decoded: an exclusion stored as/files/My%20Docsnow denies/files/My Docs/a.bak(before, an escaped deny path never matched, since requests are compared decoded).Deniedreads a*segment of a deny path as any one segment, as the platform's path exclusions do:/tenants/*/admindenies/tenants/acme/admin/x(before,*was compared literally).- Paths are compared case-folded to ASCII (U+017F is
s, U+212A isk), with trailing dots and spaces of each segment dropped (/admin./xis/admin/x), andReadingsadds the path a server that decodes twice sees (/%252e%252e/admin).Undermust hold for that reading too. CleanDeny: the stored form of a deny path (decoded and cleaned like a request path; dot segments and encoded separators refused).CheckCandidate: a guessed candidate path may hold no%25and no byte outside ASCII, raw or decoded.
v1.3.0
Added: package webpath, the one reading of a web request path
CleanPath: the path a server sees (percent-decoded, backslashes as slashes, dot segments resolved); encoded slashes, backslashes and NUL, control characters and..;are refused.Readings,Denied(case-insensitive prefix, over-blocking on purpose, every reading incl. the one without;params) andUnder(segment boundary): the platform filters planned paths and the sensor's web scope refuses requests with the same code.DestructiveandDestructiveVerbs: a path that names a state-changing action (/logout,/log-out,/admin/deleteUser,/resetPassword) is never requested by discovery and never followed by a crawler.
Added: web path discovery capabilities
enumerate.web_paths@1(routed, tier 1, phasediscover.active): request platform-supplied candidate paths on a web origin with GET or HEAD only and report the ones that answer differently from the origin's calibrated not-found response, as endpoints with status, content type, size and a body hash (never the body). Params:lists(derived,s,m,l),extensions(auto,none,backup),max_requests_per_origin(50-100000),rate(1-50 requests per second),exclude_paths. There is no recursion param: the platform plans each level.enumerate.web_params@1(later, tier 2): reserved for query parameter discovery; not runnable, and its params may change before the first implementation.
v1.2.0
Added: package secretref, the contract of task secrets
SetandRef: the secret refs a signed job carries in its payload membersecrets(names only, never values), each with a kind, a class (providerortarget, by what the value opens), the tool slot it fills, its audience (where the value may be sent), its consumer (the tool or the egress forwarder) and its local policy (allow,never,only). At most 64 refs.- Kinds
provider_key(a third-party source key; class provider, audience the provider's registry hosts) andegress_proxy(the job's proxy pool credentials; forwarder only, never local). Target kinds use the same shape: a target credential fills a slot and goes to the task's targets only. - The fetch:
FetchRequest(lease epoch, refs, single-use reply key, inside the signed body),SealedAnswer(HPKE suite 1, key id, sealed bytes),Info(the HPKE info binding sensor, command, epoch and request body),AnswerandAnswer.Check(the sensor's check of an opened answer). - The provider registry (
providers.json): every provider's key format, the hosts a tool sends its key to, and for keys that name their endpoint, the anchored host rule.Provider.ValidateKeyis the one key validator of the platform and the sensor;Provider.Audiencegives the hosts a key may reach. Errors never repeat a key.
v1.1.1
Fixed: two output rules still named 1.x members
scan.ports: one rule, service assets withtechnical.service.portandtechnical.service.transport. Theip_portsshape (ports grouped undertechnical.ip_address.ports[]) is removed, since CTIS 2.0 has no such member; the remaining rule has no shape name.check.tls:technical.certificate.sha256_fingerprint(wasfingerprint).
v1.1.0
Changed: capability output rules name CTIS 2.0 members
The output rules no longer require opaque properties keys (CTIS 2.0 gives properties no meaning) or removed 1.x members:
discover.subdomains:value(the root domain is derived by the receiver).monitor.web_content:extensions(the captures areextensions["io.openctem"].web_content).intel.passive:source_refsinstead ofproperties.source.lookup.asnranges:technical.ip_address.asn.discover.hosts:last_seen_atinstead ofproperties.live_by.scan.portsshapeopen_port_assets:technical.service.portandtechnical.service.transport(the host is in the service valuehost:port/transport).- service detection:
technical.service.app_protocolortechnical.service.product. probe.http:technical.http.status_code; technology detection:technologies;capture.screenshot(planned):value.- Findings:
asset_valueandvulnerability.cve_idremoved from the rules (asset_refis required in 2.0;vulnerability.ids);evidenceisevidence_items.
v1.0.0
First release. The packages moved out of the CTIS repository, with their history, when CTIS became a pure document format.
Added: the orchestration packages
capability,tooloption,settings,outcome,politeness,edgeprotect,addrscopeandsourcein the root modulegithub.com/openctemio/contract, with no dependency outside the standard library.transferas the nested modulegithub.com/openctemio/contract/transfer.
Changed: no dependency on the CTIS document package
capabilitydeclares its ownAssetTypenames, which follow CTIS 2.0:domain_name(wasdomainandsubdomain),web_origin(waswebsiteandhttp_service),host(wasserverandcompute),service(wasopen_portandservice),identity(wasiam_user,iam_roleandservice_account),kubernetes_cluster(waskubernetes),ip_range(wasnetwork).discovered_urlis gone; a crawl reports endpoints.cloud_resource,container_imageand the other additive types are declared.Capability.Checktakes a decoded JSON document (map[string]any) instead of a CTIS report value.- Rule paths are checked for form only; the platform checks them against the CTIS schema.