This file documents recent notable changes to this project. The format of this file is based on Keep a Changelog, and this project adheres to Semantic Versioning.
0.33.0 - 2026-05-11
- Replaced
agentKeyon thecustomerSensorListSensortype withnodeId: ID!, and switched the result grain to one row per node. The shape is nowSensor { customerId, nodeId, hostFqdn }. EachnodeIdis the parent node's database ID rendered as a string and is directly substitutable intoEventListFilterInput.sensors. Pagination cursors now order byhostFqdnwithnodeIdas a tiebreak. - Widened the role guard on
customerSensorListtoSystemAdministrator | SecurityAdministrator | SecurityManager | SecurityMonitorso Detection-side BFF callers can populate a sensor selector without falling back tonodeList. Customer-scope enforcement on thecustomerIdsargument is unchanged. - Tightened
eventList(filter: { sensors: [...] })to enforce the caller's customer scope on the explicit-sensors path. Supplying anodeIdwhose owning customer falls outside the caller's accessible scope now returns aForbiddenauthorization error instead of leaking events for that node's hostname. Unscoped (administrator) callers retain full access. The implicit (no-sensors) path is unchanged.
0.32.0 - 2026-05-10
- Added
event(id: ID!): EventGraphQL query for single-event lookup by an opaque identifier, intended for stable URL-addressable references to a detection event. EachEventnow exposes anidfield derived from the event's existing storage key. The new resolver applies the same role guard aseventList(SystemAdministrator | SecurityAdministrator | SecurityManager | SecurityMonitor) and the same customer/sensor access restrictions, so a single-record lookup cannot bypass tenant scoping. The encoding ofidis opaque; consumers must not parse it. IDs are stable for as long as the event is retained under the current storage key format — retention drop or a future key-format migration may invalidate them. - Added
eventListWithTriageGraphQL query that returns events passing the standard filter regardless of policy match, with optional inline triage scoring and exclusions. The new resolver supports two caller patterns: the interactive/corpus B trigger path that supplies thetriageargument with inlinepoliciesand/orexclusions, and the cadence corpus A fill path that calls withtriage = null. Events that score nothing keeptriageScores: nulland remain in the connection. Inline exclusions cut events from the connection and fromtotalCount. Cursor pagination matcheseventListsemantics, andfirst + 1/last + 1accounting is performed on surviving (post-exclusion) events. Accepts the new input typesEventStandardFilterInput,EventTriageInput,EventTriagePolicyInput, andEventTriageExclusionInput. Callable bySystemAdministrator | SecurityAdministrator | SecurityManager | SecurityMonitor. - Added
customerSensorListGraphQL query that returns the deployed sensors (sensor agents whoseconfigis set) on nodes the caller can access. Each entry exposescustomerId,agentKey, andhostFqdn. Non-admin users only see sensors of their accessible customers; passing acustomerIdsvalue containing an inaccessible customer returns an authorization error. Works under bothauth-jwtandauth-mtlsfeatures. - Added
applyNodeDraftandapplyAgentConfigGraphQL mutations that split the database-promotion and agent-notification concerns currently bundled inapplyNode.applyNodeDraft(id: ID!, node: NodeInput!): Node!performs the database work (delegated to the atomic node update inreview-database) and broadcasts customer-specific networks whenprofile.customer_idchanges; it does not send agent-config notifications and preserves a no-op short-circuit that returns the current DBNode.applyAgentConfig(nodeId: ID!, agentKeys: [String!]): ApplyAgentConfigOutput!reads the node's current DB state and, for each agent in the target set, attempts a notify when the agent's currentconfigisSome(non-empty), skipping with reasonDIRECT_SETUPwhenconfigisSome("")andNOT_CONFIGUREDwhenconfigisNone. Per-agent notify failures are reported inattemptsrather than only logged.agentKeysis tri-valued: absent or null targets every agent, an empty array targets none, and a non-empty array targets exactly the listed subset (rejected on duplicates or keys that do not belong to the node). Output ordering follows the suppliedagentKeyswhen provided, otherwise the node's stored agent order. Hostname-unavailable is a structural error rather than a silent skip. The existingapplyNodemutation is preserved unchanged for backwards compatibility. Both new mutations enforce the same role guards and customer scoping asapplyNode. - Added
accountLockoutPolicyGraphQL query andupdateAccountLockoutPolicymutation for administering account lockout and suspension thresholds. The policy exposes three admin-configurable settings:maxFailedAttemptsTempLock(failed sign-in attempts before a temporary lock),tempLockDurationSeconds(temporary lock duration), andmaxFailedAttemptsSuspend(failed sign-in attempts before the account is suspended). The query is available toSystemAdministratorandSecurityAdministrator; onlySystemAdministratormay update the policy. Values default to 5 attempts, 1800 seconds, and 10 attempts when unset.updateAccountLockoutPolicyenforces minimums of 3 attempts for both thresholds and 60 seconds for the temporary lock duration to prevent policies that effectively disable lockout protection or trigger immediate lock/suspension on a single mistyped password.
- Renamed the
idfield on theBlocklistRadiusGraphQL type topacketId. The newEvent.idinterface field claimsidfor the opaque event identifier, so the existing RADIUS packet identifier had to be moved to avoid a name collision. Clients reading the RADIUS packet identifier fromBlocklistRadiusmust update to the new field name. Confidence.threatCategoryandConfidenceInput.threatCategoryare now nullable (ThreatCategory->Option<ThreatCategory>) following the underlyingreview-databasechange that madeConfidence::threat_categoryoptional.- Account lockout thresholds are now read from the configurable policy
instead of being hard-coded at 5 attempts / 30 minutes. Accounts other
than
SystemAdministratorare suspended once failed attempts reach the suspension threshold;SystemAdministratoraccounts remain subject to temporary locks but are exempt from suspension. A successful sign-in resets the failed-attempt counter, while expiring a temporary lock no longer clears it, so persistent failures can still reach the suspension threshold. comprehensiveUserListnow reportsisLockedbased on the account's current temporary-lock expiry andisSuspendedfrom the account's suspension state, rather than deriving both from a single flag.- Scoped
REVIEW_WEB_DISABLE_LOCAL_AUTH_BYPASSand theis_localloopback-bypass plumbing to theauth-jwtbuild only. Underauth-mtlsthe env var is now a no-op; loopback callers are subject to the same mTLS peer-cert + JWT validation as any other peer. Operators who set this env as a workaround can drop it after upgrade.auth-jwtsemantics are unchanged. - Bumped
review-databasedependency to 0.45.0, which makes nodeTable::updatefully atomic across the Node, Agent, and ExternalService tables and changes its return type fromResult<()>toResult<Node>. No GraphQL contract changes. applyNode's internal implementation now consumes the post-updateNodereturned by the atomicTable::update, so the resolver no longer performs a separate read-back to obtain hostname for the agent-notify step. The GraphQL response shape and observable behavior ofapplyNoderemain unchanged.
0.31.0 - 2026-04-18
- Added
optionsfield to theBlocklistDhcpGraphQL type, exposing DHCP option entries as a list ofDhcpOptionobjects withcode(Int) andvalue(raw byte array) fields. - Added
customerIdfield to theAllowNetworkandBlockNetworkGraphQL object types so each list item explicitly indicates its owner customer. - Added customer scoping enforcement to allow/block network GraphQL APIs.
Non-admin users are now restricted to their own customers for all
operations:
allowNetworkList,blockNetworkList,insertAllowNetwork,insertBlockNetwork,updateAllowNetwork,updateBlockNetwork,removeAllowNetworks, andremoveBlockNetworks. Remove operations validate scope for all targets before performing any deletion. Works under bothauth-jwtandauth-mtlsfeatures. - Added
MtlsIdentitystruct andMtlsAuthenticatortrait toauth::mtlsfor dependency-inversion: the trait is defined inreview-weband implementations are injected from external crates (e.g.review).MtlsIdentityrepresents the parsed DNS SAN fields (instance,service,host,domain) extracted from a client certificate. (auth-mtls) - Added
authenticatorfield of typeArc<dyn MtlsAuthenticator>toServerConfig. (auth-mtls) - Added
get_sampling_policiesfunction to return a list of sampling policies for a given customer. The join key isNodeProfile.hostname(which is whatSamplingPolicy.nodestores), so policies whose hostname does not map to a node with a profile are skipped. Policies withnode == Noneare treated as shared/global and returned to every customer. - Added customer scoping to
TriageResponseGraphQL resolvers. Non-admin users can now only access triage responses whose sensor hostname maps to a node belonging to one of their accessible customers. Affected APIs:triageResponse,triageResponseList,insertTriageResponse,updateTriageResponse,removeTriageResponses.
- Replaced the local
ThreatLevelenum withreview-database'sThreatLevel, addingVeryLowandVeryHighvariants to the GraphQL schema. Eventlevelresolvers now delegate to the database crate instead of returning hardcoded values. - The
levelsfield inEventListFilterInputnow acceptsThreatLevelenum values instead of raw integers, preventing invalid values at the GraphQL layer. - The
eventCountsByLevelquery now returnsThreatLevelvalues instead ofu8. - Updated GraphQL network APIs to match
review-database0.44schema changes (Network no longer storescustomer_ids).- Affected GraphQL APIs:
insertNetwork,updateNetwork,Network.customerList. - Removed
customerIdsfrominsertNetworkarguments andNetworkUpdateInput. - Removed
customerListfield fromNetwork.
- Affected GraphQL APIs:
- Updated network tag GraphQL APIs to use customer-scoped tag sets.
- Affected GraphQL APIs:
networkTagList,insertNetworkTag,removeNetworkTag,updateNetworkTag. - Added required
customerIdtoinsertNetworkTag,removeNetworkTag, andupdateNetworkTag. networkTagListnow returns all tags forSystemAdministratorwhencustomerIdis omitted, and returns customer-scoped tags whencustomerIdis provided.
- Affected GraphQL APIs:
- Restricted backup/restore GraphQL queries and mutations to SystemAdministrator, denying SecurityAdministrator access.
allowNetworkListandblockNetworkListGraphQL queries now acceptcustomerIds: [ID](multiple customer IDs) instead of the previouscustomerId: ID. The input list is deduplicated and sorted by ID for deterministic ordering and pagination. OmittingcustomerIdsstill returns results for all accessible customers.- Restricted
updateNetworkandremoveNetworksGraphQL mutations toSystemAdministratoronly.insertNetwork,networkList, andnetwork(id)guards remain unchanged. - Enforced customer scoping for Network and NetworkTag GraphQL APIs.
insertNetwork: scopedSecurityAdministratorandSecurityManagercan only insert when every referenced tag belongs to an in-scope customer.tagIds: []remains allowed.SecurityMonitoris forbidden.networkTagList(customerId: X): returnsForbiddenwhenXis out of scope for non-admin callers.insertNetworkTag,updateNetworkTag,removeNetworkTag: returnForbiddenwhen thecustomerIdis out of scope for non-admin callers.networkListandnetwork(id)remain globally readable for all allowed roles.
- Enforced customer scoping for
TriagePolicyGraphQL APIs so scoped security administrators can only read and mutate global policies and policies for customers they belong to. - Enforced customer scoping for
TriagePolicyGraphQL APIs. Scoped security administrators can read and list shared and in-scope customer-owned policies, but can only mutate customer-owned policies within their customer scope. Shared policies remain system-managed and are read-only for scoped users. - Restricted
removeEventTagandupdateEventTagGraphQL mutations toSystemAdministrator. graphql_handlerandgraphql_ws_handlernow delegate certificate validation toauthenticator.authenticate()rather than the previously internalvalidate_client_cert(), making the validation policy replaceable at runtime. (auth-mtls)- Unified all
cluster_idandmodel_idtypes tou32across the codebase, replacing previous uses ofi32,String, andusize. This change aligns with the corresponding type unification inreview-database. - Enforced customer scoping for Node GraphQL operations for non-admin users.
Affected APIs:
node,nodeList,nodeStatusList,insertNode,updateNodeDraft,removeNodes,applyNode,nodeReboot,nodeShutdown. Administrators (customer_ids = None) retain full access. - Updated
backupConfigGraphQL query andupdateBackupConfigmutation to align with the newreview-databaseBackupConfigownership and storage design.backupConfignow returnsnullwhen no backup configuration has been initialized (previously returned a default object). Clients should handle anullresponse and callinitBackupConfigbefore updating. - Updated
BlocklistDceRpcGraphQL type to match the newreview-databaseDCE/RPC event schema. Removed legacy fields (rtt,namedPipe,endpoint,operation) and addedcontext: [DceRpcContext!]!andrequest: [String!]!. updateCustomermutation now validates for duplicate network names, matching the existing validation ininsertCustomer.
nodeRebootandnodeShutdownnow update thestoredStatusof all agents on the target node toUnknownafter the operation completes successfully.- Refactored GraphQL root
MergedObjectgroups (Query/Mutation) into smaller units to mitigatequeries overflow the depth limiton Rust 1.94.0+, likely triggered by increased type-layout query depth afterManuallyDrop<T>began wrappingTwithMaybeDangling<T>; no schema or response behavior changes.
- Removed
validate_client_cert()andhas_service_name()fromauth::mtls. Callers that relied on these functions should implementMtlsAuthenticatorinstead. (auth-mtls)
0.30.1 - 2026-01-31
- Added mTLS authentication feature, including mutual TLS validation for client connections and context JWT checks for authenticated requests. This entry corrects a missing note from 0.30.0; the functionality is unchanged from 0.30.0 and only the CHANGELOG is updated.
0.30.0 - 2026-01-29
- Added SecurityAdministrator access to data source mutations.
- Added GraphQL API for managing
BackupConfigsettings:backupConfigquery: Retrieves the current backup configuration. Returns default values (backup every 1 day at 23:59:59 UTC, keeping 5 backups) if no configuration is stored. Accessible to SystemAdministrator and SecurityAdministrator roles.setBackupConfigmutation: Creates or overwrites the backup configuration. Requires SystemAdministrator or SecurityAdministrator role.updateBackupConfigmutation: Updates the existing backup configuration using optimistic concurrency control. Requires SystemAdministrator or SecurityAdministrator role.- All mutations validate input:
backupDurationandnumOfBackupsToKeepmust be >= 1, andbackupTimemust be in valid HH:MM:SS format.
- Added
unlockAccountGraphQL mutation for system administrators to manually unlock user accounts that are locked due to failed login attempts. This allows administrators to reactivate locked accounts without waiting for the automatic lockout period to expire. - Added
unsuspendAccountGraphQL mutation for system administrators to manually unsuspend user accounts. This provides the foundation for account suspension management functionality. - Added
graphql::customer_accessmodule with customer-scoping helpers for GraphQL authorization. Provides membership checks and customer scoping utilities for use in GraphQL resolvers.
- Changed the return type of all GraphQL
totalCountfields from integer types toStringNumberto prevent potential overflow when casting large counts to GraphQL's Int type (i32). - The
trustedDomainListGraphQL API endpoint now exposes atotalCountfield that returns the total number of trusted domains in the database as aStringNumber<usize>. This prevents potential overflow issues with GraphQL'sInttype by encoding the count as a string. - Updated the
servefunction signature to useArc<std::sync::RwLock<Store>>instead ofArc<tokio::sync::RwLock<Store>>, following the removal of thetokiodependency from thereview-databasecrate. - Aligned triage GraphQL with the updated review-database schema:
- Added CRUD GraphQL for
TriageExclusionReasonbacked by the RocksDBtriage_exclusion_map. - Triage policies now take
triageExclusionIdand optionalcustomerId;triagePolicyListsupportscustomerIdfiltering (matching or global policies), andtotalCountfollows the same rule. - Event filters resolve triage exclusion IDs through the RocksDB map to build
TriagePolicyInputbefore callingEventFilter::new, keeping triage application consistent with the new model. - Added validation to prevent deleting customers or triage exclusion reasons when referenced by triage policies.
- Added CRUD GraphQL for
- Renamed GraphQL APIs to reflect the renamed
tidbtolabelDbchange in review-database.- Replaced the
tidbschema module withlabel_db. - Affected GraphQL APIs:
labelDb,labelDbList,labelDbRule,insertLabelDb,updateLabelDb,removeLabelDb.
- Replaced the
AllowNetworkandBlockNetworkGraphQL APIs now requirecustomer_idfor all operations (insert, update, list).- Affected GraphQL APIs:
insertAllowNetwork,updateAllowNetwork,allowNetworkList,insertBlockNetwork,updateBlockNetwork,blockNetworkList.
- Affected GraphQL APIs:
- Modified
AllowNetworkandBlockNetworkoperations to transmit networks only to the semi-supervised engines belonging to the affected customer, replacing the previous global broadcast behavior.- Renamed the
broadcast_[allow/block]_networksmethod ofAgentManagertrait tosend_agent_specific_[allow/block]_networksas the functionality ofbroadcast_[allow/block]_networkschanges from broadcast to fine-targeting nodes and agents using agent keys and hostnames to send. - Changed the argument type of the
send_agent_specific_[allow/block]_networksmethod fromHostNetworkGrouptoNetworksTargetAgentKeysPairarray. This change will allow the Manager Server that implementssend_agent_specific_[allow/block]_networksto provide the allow/block networks corresponding to the agent information of the Semi-supervised Engine. - Added validation to prevent deleting customers when referenced by allow/block networks.
- Renamed the
- BREAKING: Unified event structure field names across all GraphQL APIs to
use
orig_addr/orig_portandresp_addr/resp_portterminology instead ofsrc_addr/src_portanddst_addr/dst_port. This change standardizes the naming convention with the originator/responder pattern used in network event analysis. The following field renamings apply:srcAddr→origAddrsrcPort→origPortsrcAddrs→origAddrssrcCountry→origCountrysrcCustomer→origCustomersrcNetwork→origNetworksrcCountries→origCountriessrcCustomers→origCustomersdstAddr→respAddrdstPort→respPortdstAddrs→respAddrsdstPorts→respPortsdstCountry→respCountrydstCustomer→respCustomerdstNetwork→respNetworkdstCountries→respCountriesdstCustomers→respCustomers
- Updated event struct terminologies to align with the unified event structure.
- Updated
LockyRansomwareevent threat level fromMediumtoHighto match the definition in review-database. - Updated
LdapPlainTextevent threat level fromLowtoMedium.
- IP location resolvers now coerce
(0.0, 0.0)from ip2location toNonewhen mapping into ourIpLocationstruct, so private/unresolved IPs are not treated as real coordinates.
0.29.4 - 2025-12-11
- Updated review-database dependency to version 0.42.4, since 0.42.3 is yanked.
0.29.3 - 2025-12-10
- Updated review-database dependency to version 0.42.3, since 0.42.2 is yanked.
0.29.2 - 2025-12-08
- Updated review-database dependency to version 0.42.2, since 0.42.1 is yanked.
0.29.1 - 2025-12-04
- Updated review-database dependency to version 0.42.1, since 0.42.0 is yanked.
0.29.0 - 2025-12-03
- Added
eventTriageListGraphQL query to retrieve detection events sorted by triage policy score in descending order. This API accepts filter criteria (including time ranges and triage policies) and an optional count parameter (defaulting to 100). Events are sorted by their highest triage score, with secondary priority given to event type when scores are equal (HttpThreatwithout cluster ID has highest priority, followed byDnsCovertChannel,DomainGenerationAlgorithm,LockyRansomware,HttpThreatwith cluster ID, and other events). Only events with triage scores are included in the results. This enables prioritizing analysis of potentially high-risk events. - Exposed
start_timefield in GraphQL APIs for all detection event types, reflecting the corresponding updates in review-database. Event types that already hadstart_time(RdpBruteForce,LdapBruteForce,FtpBruteForce,RepeatedHttpSessions,PortScan,MultiHostPortScan,ExternalDdos) are unchanged. With this update, thetimefield now represents when the event was generated, whilestart_timeindicates when the event actually began. - Added session information fields to GraphQL APIs for all single-raw event-based
detection event types. The new fields include
duration(session duration in nanoseconds),orig_pkts(packets sent by source),resp_pkts(packets received by destination),orig_l2_bytes(layer 2 bytes sent by source), andresp_l2_bytes(layer 2 bytes received by destination). These fields provide detailed network session metrics for protocol-level detection events. - Added
backupsGraphQL query for listing RocksDB backups. Returns backup information including id, timestamp, and size, sorted by timestamp in descending order (latest first) without pagination. Available to System and Security Administrators for backup management and restore point selection. - Added
restoreFromBackupGraphQL mutation to restore RocksDB from a specific backup ID. This enables point-in-time recovery and operational workflows for database restoration. - Added support for confidence operator filtering in the detection GraphQL API.
The
EventListFilterInputandFilterInputnow acceptconfidenceMinandconfidenceMaxfields for range-based filtering, replacing the singleconfidencefield. Filter insert/replace/list mutations correctly handle and round-trip the expanded confidence data. - Added GraphQL support for new blocklist detection events (
BlocklistRadiusandBlocklistMalformedDns) in botheventListandeventStreamqueries. Each event exposes the standard flow metadata (addresses, ports, protocol, timestamps) along with its protocol-specific fields for detailed RADIUS and DNS anomaly analysis. - Added GraphQL support for the
UnusualDestinationPatterndetection event in botheventListandeventStreamqueries. This event detects unusual patterns of connections to multiple destination IP addresses, exposing fields such as destination IPs, connection count, statistical measures (expected mean, standard deviation, z-score), confidence, category, and triage scores.
- Removed the
db: Databaseparameter from theserve()function. Cluster loading operations now use the RocksDB-basedStoreinstead of the PostgreSQL-basedDatabase. Callers ofserve()no longer need to provide aDatabaseinstance. - Implemented forced password change for users whose passwords are reset by a
system administrator via
resetAdminPasswordorupdateAccountGraphQL APIs. - Unified the
start_timefield type toDateTime<Utc>across all detection event types in GraphQL APIs. Previously, some blocklist events returnedstart_timeas a numeric timestamp, while others usedDateTime<Utc>. All detection events now consistently returnstart_timeasDateTime<Utc>for better type safety and interoperability. - Converted GraphQL
Eventtype from Union to Interface. TheEventtype now exposes six common fields directly (time,sensor,confidence,category,level,triageScores) without requiring inline fragments. Existing queries using inline fragments remain compatible, while new queries can access common fields directly. Type-specific fields likelearningMethodremain on individual event types. - Updated authentication endpoints (
signIn,signInWithNewPassword, andrefreshToken) to return dual JWT tokens:reviewTokenfor REview authentication andaimerTokenfor Aimer integration. TheaimerTokenuses RS256 signing with REview's private key and includes the hostname as thekidheader claim for certificate-based validation. - Migrated cluster and model data storage from PostgreSQL-based
Databaseto RocksDB-basedTable.- Updated
Clusterstruct: removed thenamefield - Breaking changes to GraphQL APIs:
clusters,update_cluster.
- Updated
- The String type for
cluster_idis no longer used as the cluster key. it is now identified by a numeric cluster ID combined with the model ID. - Removed the
Unknownvariant from theThreatCategoryenum, following its removal fromreview_database::EventCategory.- As a result, event-related GraphQL APIs that expose the
categoryfield usingThreatCategorynow returnOption<ThreatCategory>. Events with an unspecified category will returnNone, while known categories will be wrapped inSome. - Updated the
EventListFilterInputGraphQL input type to support filtering for events with unspecified categories. Thecategoriesfield now acceptsNonevalues within its list, allowing queries to explicitly match events without a defined category.
- As a result, event-related GraphQL APIs that expose the
- Updated GraphQL response structures for FTP-related events (
FtpPlainText,BlocklistFtp) to reflect changes in review-database. These now expose acommands: Vec<FtpCommand>field containing full session command and response details. - Updated the triage policy-related GraphQL APIs to align with breaking changes
in the
review-database. The previously usedTistruct has been replaced with theTriageExclusionReasonenum, affecting thetiDbfield intriagePolicyand related mutations. This change ensures compatibility with the updated database schema for handling threat intelligence exclusions. - Updated chrono to 0.4.42 to match the version used in review-database and fix build errors caused by version mismatch.
- Updated method calls to use
u32formodel_idandcluster_id, following their type change fromi32tou32in the RocksDB storage layer. - Changed the
expirationTimeGraphQL query to returnStringNumber<u32>instead ofi64. The response format changes from an integer to a string-encoded number (e.g.,12becomes"12") to prevent overflow issues with GraphQL'sInttype while maintaining the correct underlyingu32data type for the account expiry period in seconds.
- Removed
end_timefrom single-raw event-based detection events, in alignment with recent changes in review-database where theend_timefield was removed. This is because the combination ofstart_timeanddurationsufficiently represents the event's time range, makingend_timeredundant.
- Fixed
FtpPlainTextthreat level to Medium to matchreview-database.
0.28.0 - 2025-09-30
- Added
TorConnectionConnevent detection for connection-level Tor network monitoring. This extends existing Tor detection capabilities beyond HTTP connections to include all connection types. - Added
comprehensiveUserListGraphQL query for system administrators to fetch all user accounts with security status information including account lock/suspension status, creation time, last signin time, and access restrictions. - Added
removeAccountsExactGraphQL mutation for removing accounts using exact username matching without normalization. This provides backward compatibility for accounts created before strict username validation was enforced. - Implemented account lockout functionality for failed login attempts. Accounts are locked for 30 minutes after 5 consecutive failed login attempts to prevent brute force attacks.
- Added
confidenceandkindfield totidbRuleGraphQL API. - Implemented comprehensive logging for
TriageResponseoperations with detailed audit logs for all insert, update, remove, and retrieve operations on triage responses. - Added
sensorfield to GraphQL objects for detection events based on multiple raw events (PortScan,MultiHostPortScan,ExternalDdos,RdpBruteForce,FtpBruteForce,LdapBruteForce). - Added
start_timeandend_timefields to GraphQL objects forRepeatedHttpSessions.
- Consolidated HTTP event fields for better consistency. The
orig_mime_typesandresp_mime_typesfields are now unified into a singlemime_typesfield. Theorig_filenamesandresp_filenamesfields are consolidated intofilenames. Thepost_bodyfield is renamed tobody. - Restricted account creation and deletion permissions to System Administrators
only. The
insertAccount,removeAccounts, andremoveAccountsExactGraphQL mutations now require theSystemAdministratorrole instead of allowing bothSystemAdministratorandSecurityAdministratorroles. This enhances system security by enforcing stricter role-based access control for sensitive account management operations. - Bumped Roxy version to 0.5.0 with updated
ResourceUsagestruct field names. Thetotal_disk_spacefield is now calculated asdisk_used_bytes+disk_available_bytes, andused_disk_spaceis now accessed asdisk_used_bytes. - Added safeguards to the
updateAccountGraphQL mutation to prevent system administrators from demoting themselves and to block other roles from promoting themselves to system administrator. - Updated the
removeAccountsGraphQL mutation to prevent users from removing their own accounts. - Enhanced
signedInAccountListGraphQL API to include customer IDs in theSignedInAccounttype. - Updated
myAccountGraphQL API to return the newMyAccounttype instead ofAccount. TheMyAccounttype adds anexpire_timesfield, which provides JWT expiration times for all active sessions of the current user. - Changed the return type of the
removeTrustedUserAgentsGraphQL API frombooltoVec<String>. The API now returns a list of removed user agents when all input agents are successfully deleted, or an error message if any agents could not be removed. Even in case of an error,apply_allow_networksis called to apply the removed agents. - Updated
removeAccountsGraphQL mutation to use proper username validation and normalization (same as account creation), ensuring consistent handling of usernames across all account operations. - Improved max parallel sessions logic in the
signInandsignInWithNewPasswordAPIs to exclude expired JWTs when evaluating active sessions.- Now, only unexpired JWT tokens are considered when checking session limits,
made possible by disabling the
Validation.validate_expoption indecode_token. This change allows decoding of expired tokens—a behavior previously blocked by thejsonwebtokencrate's default expiration check—and ensures thatvalidate_max_parallel_sessionsaccurately counts only valid, unexpired tokens.
- Now, only unexpired JWT tokens are considered when checking session limits,
made possible by disabling the
- Migrated from PostgreSQL-based
DatabaseAPI to RocksDB-basedTableAPI. The review-database crate has been updated to fetchColumnStatsandCsvColumnExtrafrom RocksDB instead of PostgreSQL. With the corresponding RocksDB-based methods now available, existing APIs that previously relied on PostgreSQL have been modified to use the RocksDB-based implementations instead. The following methods were replaced with their RocksDB-based equivalents:get_top_columns_of_model,get_top_multimaps_of_model,count_rounds_by_cluster,load_rounds_by_cluster,get_column_types_of_model,get_top_ip_addresses_of_cluster,get_top_ip_addresses_of_model
- Updated GraphQL APIs to reflect the addition of the
PeriodForSearchfield in theFilterstructure from review-database.- Defined GraphQL input types
PeriodForSearchInput,PeriodInputand output typesPeriodForSearch,CustomPeriod. - Affected GraphQL APIs:
insertFilter,replaceFilter,filterList,filter.
- Defined GraphQL input types
- Updated GraphQL APIs to reflect the addition of the
confidencefield in the semi-supervised generated event structure from review-database.- Affected GraphQL APIs:
eventList,eventStream.
- Affected GraphQL APIs:
- Renamed a time-related GraphQL field from
session_end_time,durationtoend_timeto reflect a database update.- Affected event kinds:
BlocklistConn,TorConnectionConn,LockyRansomware,DnsCovertChannel,TorConnection
- Affected event kinds:
- Migrated from PostgreSQL-based
DatabaseAPI to RocksDB-basedTableAPI. The review-database crate has been updated to fetchTimeSeriesfrom RocksDB instead of PostgreSQL. The following methods were replaced with their RocksDB-based equivalents:get_time_range_of_model,get_top_time_series_of_model,get_top_time_series_of_cluster.
- Improved customer removal to prevent stale references in account and node tables. The process now checks for existing references in accounts or nodes and returns an error if any are found.
- Added support for client certificate authentication when communicating with
all proxied servers. Review Web now presents client certificates for
mutual TLS authentication when
client_certandclient_keyconfiguration options are provided.
0.27.0 - 2025-07-15
- Added
confidencefield to most Blocklist GraphQL objects for consistency withBlocklistTls. The field provides confidence scores for security detections across different protocol blocklists. - Added
levelfield to 27 detection event types that previously lacked ThreatLevel values. All blocklist and brute force events return Medium threat level, while plain text events return Low threat level.
- Updated review-database to 0.39.0.
- The
updateAccountGraphQL mutation'spasswordparameter type has been changed fromOption<UpdatePassword>toOption<String>. The mutation now accepts the new password directly without requiring the old password, as SystemAdministrators do not have access to users' current passwords. - Modified the GraphQL API to prevent additional System administrator accounts from being created during insert/update.
- Fixed external service removal in
applyNodemutation. When an external service's draft is set tonull, the service is now properly removed from the node during application.
0.26.0 - 2025-06-25
- Introduced
myAccountGraphQL API, which allows users of all roles to query their own account information. - Enhanced
signedInAccountListGraphQL API to include additional account details (name,department,role) in theSignedInAccounttype, providing richer information about currently signed-in users. - Added
updateMyAccountGraphQL mutation that allows authenticated users to update their own account information including password, name, department, language, and theme settings. This enables user self-service account management for all user roles. - Added username validation and normalization with the following rules:
- No whitespace allowed
- Only lowercase English letters, digits, and special characters
(
.,-,_) are allowed - No consecutive special characters or special characters at the end
- Must start with a lowercase English letter
- Length must be 3-30 characters
- Uppercase letters are automatically converted to lowercase
- Added
levelandlearningMethodfields to all detected event types:- Threat level:
HttpThreatevents returnLOW, all others returnMEDIUM - Learning method:
HttpThreat,NetworkThreat,WindowsThreat, andExtraThreatevents returnUNSUPERVISED, all others returnSEMI_SUPERVISED
- Threat level:
- Added
forceSignOutGraphQL mutation to allow system administrators and security administrators to forcefully terminate all active sessions for any user, enhancing security management capabilities.
- Restricted
updateAccountGraphQL mutation access toSystemAdministratorrole only for enhanced security. Previously accessible to bothSystemAdministratorandSecurityAdministratorroles. - Fixed the event stream query iterator performance issue by implementing
dynamic advancement of stuck event time variables. Added
event_stuck_check_intervalparameter toeventStreamto configure the check interval (defaults to 5 minutes). This prevents the iterator from getting stuck on old timestamps when certain event types become inactive for extended periods. - Renamed GraphQL field
lastTimetoendTimein all event types to better reflect its semantic meaning. This affects all event objects in the GraphQL schema, including but not limited toPortScan,MultiHostPortScan,ExternalDdos,BlocklistConn,BlocklistTls,SuspiciousTlsTraffic, and other event types in thesrc/graphql/event/modules. - Updated the GraphQL APIs related to account as the
customer_idsfield was added to theAccountstructure in the review-database. - Added
confidencefield toBlocklistTlsFieldsevent structure. - Changed the behavior of the
EventListFilterInput::sensorsin event related GraphQL APIs.- If the
sensorsfield is provided, only events collected from the sensors are returned. - If the
sensorsfield is not provided, the software filters events from sensors owned by the customers the user belongs to.
- If the
- Replaced
Vec<u32>withVec<ID>forcustomer_idsandtag_ids. The affected GraphQL APIs are as follows:- Parameter type changes:
insertAccount,updateAccount,insertNetwork,updateNetwork,insertTriageResponse,updateTriageResponse. - Return type changes:
account,accountList,triageResponse,triageResponseList.
- Parameter type changes:
- Updated
removeTrustedDomainGraphQL API toremoveTrustedDomainsto support multiple removals. - Updated review-database to 0.37.0, which fixes event filtering by multiple IP
addresses for
ExternalDdos,MultiHostPortScan, andRdpBruteForce. - Renamed
BlockListtoBlocklistandblock_listtoblocklistin line with the Rust API Guidelines for acronyms/compound words. This affects GraphQL APIs such aseventListandeventStreamand may cause breaking changes for clients relying on the old field name. - Changed behavior of blocklist, allowlist and trusted user agents updates to
automatically broadcast without manual apply.
- As a result of this change, the following GraphQL APIs used for manual apply
have been removed:
applyBlockNetworks,applyAllowNetworks,applyTrustedUserAgent - The following GraphQL APIs have been updated to immediately broadcast
changes, without requiring a separate apply step:
insertAllowNetwork,removeAllowNetworks,updateAllowNetwork,insertBlockNetwork,removeBlockNetworks,updateBlockNetwork,insertTrustedUserAgents,removeTrustedUserAgents,updateTrustedUserAgent
- As a result of this change, the following GraphQL APIs used for manual apply
have been removed:
- Renamed
host_namesfield tohostnamesin GraphQL types:FilterInput,EventListFilterInput, andFilter. This affects GraphQL APIs such asinsertFilter,replaceFilter,filter, andfilterList. - Enhanced password security by preventing password reuse in
updateAccountandresetAdminPasswordGraphQL APIs.- The
updateAccountAPI now requires password changes to provide both old and new password values using the format{ old: "...", new: "..." }instead of just the new password. - Both APIs now validate that the new password is different from the current password and reject changes that attempt to reuse the current password.
- The
- Modified code related to the packet attribute triage. The scoring
functionality for packet attribute triage was previously not implemented, but
is now correctly supported on the review-database side. To reflect this,
the related code has been updated accordingly.
- A new field
raw_event_kindof typeRawEventKindhas been added toPacketAttrInput. - The same field has also been added as a return field to
PacketAttr, which is one of the types used in triage-related GraphQL API queries. - Introduced new enum variants (
UInteger,Vector,IpAddr,Bool) to theValueKindenum for strict type matching of packet attributes. - This changes affects GraphQL APIs such as
insertTriagePolicy,updateTriagePolicy,triagePolicyList, andtriagePolicy. They may introduce breaking changes for clients relying on the previous GraphQL schema.
- A new field
- Modified code related to node management. The review-database has introduced
the concept of "external service" to clearly distinguish applications that
provide an API for interaction and operate outside the REview agent ecosystem,
from directly connected agents over QUIC. To reflect this concept, the
node-related code has been updated accordingly.
- Added new structs
ExternalServiceandExternalServiceSnapshot, along with enumsExternalServiceStatusandExternalServiceKind, to represent configuration for external services. The previously usedGigantostruct, which was responsible for storing configuration for the DataStore, has been removed and replaced byExternalService. - Replaced the
gigantofield of typeOption<GigantoInput>in bothNodeInputandNodeDraftInputwith anexternal_servicesfield of typeVec<ExternalServiceInput>. TheGigantoInputstruct, which was limited to handling input for the DataStore only, has been removed. Configuration input for all external services—including DataStore—is now provided throughExternalServiceInput. - Breaking changes have been introduced in the GraphQL APIs (
nodeStatusList,nodeList,node,insertNode,updateNodeDraft,applyNode). So clients that use the affected APIs may need to update their code to maintain compatibility.
- Added new structs
- Modified
ThreatCategoryto include all MITRE categories.Collection,DefenseEvasion,Persistence,PrivilegeEscalation,ResourceDevelopmentare added.
- Fixed a security issue where the
language,updateLanguage,theme, andupdateThemeAPIs allowed changing another user's settings by providing a differentusernameparameter.- The
usernameparameter has been removed, and the APIs now extract the username from the JWT for authorization.
- The
- Fixed a bug in the
updateNodeDraftGraphQL API where adding a new agent to an already configured node could fail. - Fixed an issue where GraphQL APIs using
EventListFilterInputfailed to filter events bykinds. - Corrected instances of
referrertorefererfor the HTTP header field name to align with the official HTTP standard's spelling.
graphql::get_trusted_user_agent_listhas been removed as it is no longer used.- The
themeandlanguageGraphQL APIs are removed. Use themyAccountGraphQL API instead to retrieve equivalent information. - The deprecated member
HttpThreatofThreatCategoryis removed.
0.25.0 - 2025-01-27
-
Added the
updateTrustedDomainGraphQL API, allowing users to modify a trusted domain. -
Added
IpAddressGraphQL custom scalar for IP addresses.-
Applied it to the GraphQL APIs
ipLocation,ipLocationList,insertAccount,updateAccount,insertSamplingPolicy, andupdateSamplingPolicy. -
The API returns the following error message when a value cannot be parsed as an
IpAddr(e.g., when "abc" is given):Failed to parse "IpAddress": Invalid IP address: abc (occurred while parsing "[IpAddress!]")
-
-
Added the
themefield to theAccountstruct to store the user's selected screen color mode. Accordingly, the functions for inserting and updating accounts have been modified, and new APIs have been added to retrieve and update the user's selected screen color mode.
- The paginated GraphQL queries use different representations for cursors. The cursor values obtained from earlier versions of the API are not compatible with the new cursor values.
- Replaced the term source with sensor, where it refers to a device or software that captures or detects raw events. This update broadly affects GraphQL APIs that previously used source field as a parameter, and GraphQL APIs that return event, outlier, or triage related structs.
- Updated review-database to 0.34.0.
- The
ip2location::DBargument forserveno longer needs to be wrapped inArcandMutex. This change simplifies the code and improves performance by removing unnecessary locking. - Modified the type of
cluster_idfield of the detection event structures fromusizetoOption<usize>:HttpThreat,ExtraThreat,NetworkThreat,WindowsThreat. - The GraphQL API for
WindowsThreatevent structure is changed to returnIDtype instead ofusizetype value for thecluster_idfield. - Updated
insertNodeGraphQL API to no longer requireconfigfor theagentsparameter. - Updated account-related GraphQL APIs to reflect the type change of
Account::max_parallel_sessionsfromOption<u32>toOption<u8>.- The
accountand related queries such asaccountListnow returnmaxParallelSessionsas anIntwithin the range ofu8. - The
insertAccountandupdateAccountGraphQL APIs remain unchanged in their interfaces but now only accept parameters related to max parallel sessions within the range ofu8.
- The
- Changed
AgentManager::broadcast_trusted_user_agent_listmethod signature from&[u8]to&[String]. Implementors ofAgentManagerwill need to update their implementations. This change simplifies the API by removing serialization concerns from callers. - Modified to broadcast the correct internal network list for each
Semi-supervised Engine. The changes are as follows.
- Renamed the
broadcast_internal_networksmethod of toAgentManagertrait tosend_agent_specific_internal_networksas the functionality ofbroadcast_internal_networkschanges from broadcast to fine-targeting nodes and agents using agent keys and hostnames to send. - Changed the argument type of the
send_agent_specific_internal_networksmethod fromHostNetworkGrouptoNetworksTargetAgentKeysPairarray. This change will allow the Central Management Server that implementssend_agent_specific_internal_networksto provide the internal networks corresponding to the agent information of the Semi-supervised Engine. - Renamed
get_customer_id_of_nodetoagent_keys_by_customer_idas the functionality ofget_customer_id_of_nodehas changed. The function returns agent info list by all customer id.
- Renamed the
- Removed
graphql::account::reset_admin_passwordfunction as it was obsoleted by the GraphQL APIresetAdminPassword.
- Resolved an issue in the
applyNodeGraphQL API, where configuration values set to an empty string were not saved to theconfigin the database. - Fixed an issue where configuration conversion failures were silently ignored, leading to incorrect None handling.
0.24.0 - 2024-11-19
- Added the
TimeSeriesGeneratorvariant to theAgentKindenum. - Added
signInWithNewPasswordGraphQL API for signing in with a new password.- The
signInGraphQL API now returns an error if the account was never signed in before. This change is part of enhancing account security by requiring all users to update their passwords upon their first signing in.
- The
- Modified
applyNodeGraphQL API logic to prevent notifying agents that are operating with local configuration. - Updated
updateNodeDraftGraphQL API to no longer requireconfiginNodeDraftInput::agents. - Updated review-database to 0.32.0.
- Renamed
AgentKindenum variants to align with review-database.
- Added missing
nodefield insamplingPolicyandsamplingPolicyListGraphQL API responses in theSamplingPolicyobject.
0.23.0 - 2024-10-23
- Modified the
AgentManagertrait to acceptHostNetworkGroupdirectly instead of its serialized form. This change decouples review-web from dictating the serialized form ofHostNetworkGroup, which should be handled by the review-protocol crate. - The
applyNodeGraphQL API now accepts aNodeInputargument, in order to validate that the provided node data matches the current state in the database before applying changes. - The default connection size is no longer used. Instead, the maximum connection size is applied if users don't specify a size.
- Changed the distance search conditions for
rankedOutliersGraphQL API.- start only: Search for outliers whose distance value is greater than or equal to the start value.
- Fixed
savedOutliersandrankedOutliersto properly validate pagination parameters. - Fixed to return results from the
rankedOutliersGraphQL API in ascending order. This change ensures a consistent pattern forrankedOutlierscursors, helping users avoid confusion with various start and end cursor patterns when using query. - Fixed the
rankedOutliersGraphQL API- when
rankedOutlierscalled with a cursor, theRankedOutliervalue corresponding to that cursor is excluded from the returned results. - Removed the code associated with the
tovariable becauseafterandbeforeare not used together in the query. - Removed unnecessary
continuethat is performed after checking the number of outliers. This change will return results faster because not all outliers are checked.
- when
0.22.0 - 2024-10-04
- Added the
ipLocationListGraphQL API for multiple addresses.
- Updated review-database to 0.31.0.
- Updated
nodeStatusListGraphQL API response to includenameDraft,profile,profileDraft, andgigantoDraft, offering a more comprehensive view of the node's status.
- Fixed an issue in the
applyNodeGraphQL API where agents could not be properly identified.
- The
AgentManager::get_configmethod has been removed as part of the new configuration management approach. This aligns with the update toreview-protocolversion 0.7.0.
0.21.0 - 2024-09-05
- Added
Configto the public API under thebackendmodule to ensure all types used by the public traitsAgentManagerandCertManagerare accessible. - Added session limitation based on the
max_parallel_sessionsfield ofAccountduring sign-in. - Added ip access control based on the
allow_access_fromfield ofAccountduring sign-in. - Added
AgentManager::update_configmethod to notify agents to update their configurations. - Added new detected events:
BlockListBootp,BlockListDhcp,SuspiciousTlsTraffic
- Added the
languageGraphQL API to get the user's UI language selection, and theupdateLanguageGraphQL API to modify it.
- Changed to retrieve the admin account's name and password from the
REVIEW_ADMINenvironment variable, which is inusername:passwordformat, instead of using hardcoded credentials. - Moved
AgentManagerandCertManagertraits from thegraphqlmodule to a newly createdbackendmodule. This change better organizes the code structure by separating concerns, as these traits are not directly related to the GraphQL API but are instead utilized within it. - Updated depedencies, including:
- Updated review-database to 0.30.0. As part of this update, the fields of
detected events, including
BlockListConn,HttpThreat,BlockListNtlm,BlockListSmtp,BlockListSsh, andBlockListTls, andTorConnectionto align with the updated version of review-database. - Updated review-protocol to 0.4.2.
- Updated rustls to version 0.23 and reqwest to version 0.12. These updates were made together to ensure the rustls version used by the reqwest library matches the version directly depended on by this module.
- Updated async-graphql to 7. As part of this update, the
MutationandQuerystructures were split into substructures to avoid the "Requirement evaluation overflow" error when implementing theMergedObjecttrait. This is a bug in async-graphql 7.0.2 and later, and these structures will be merged back into one structure when async-graphql is patched for that bug in the future.
- Updated review-database to 0.30.0. As part of this update, the fields of
detected events, including
- Modified the
NodeandNodeProfilefields, along with updatingNode-related CRUD APIs to align with the updated schema. The changes reflect the introduction of the newAgenttable, which stores configuration data in TOML format strings. - Added
categoryfield to TI db and rules. - Added
categoryfields to all the the detected events. - Changed GraphQL API
preserveOutliersto usePreserveOutliersOutputin its response.- Instead of returning the count of successfully marked outliers, this endpoint now returns a list of outliers that were not marked as saved.
- Changed GraphQL APIs to return
StringNumberorIDinstead of integers beyondi32in all applicable APIs. - Refactored
AgentManager::pingto returnDurationinstead ofi64. This refactor improves the flexibility and accuracy of thepingmethod, making it more robust and aligned with Rust's time handling conventions. - In the GraphQL API, modified the
pingfield inNodeStatusto return aFloat(seconds) instead of aInt(microseconds). This change improves precision when converting the internal representation of thepingfield to a GraphQL-compatible type. - Added a
languagefield to theAccount. Consequently, theaccountandaccountListAPI responses now include this field. TheinsertAccountandupdateAccountGraphQL API endpoints are also updated to support the field. - Updated the
applyNodeGraphQL API to align with the new node and agent management approach.- The API updates the database with draft values, notifies agents to update their configurations, and logs the changes, as long as each step is needed.
- The
successModulesfield has been removed from the API response. Instead, the response now includesgigantoDraft, representing the draft configuration of the Giganto module. IfgigantoDraftisNone, it means either the node does not have the Giganto module or the draft for the Giganto is unavailable. In the latter case, this indicates that the Giganto should be disabled, resulting in the node no longer having the Giganto module.
- Updated the
nodeStatusListGraphQL API to align with the new node and agent management approach. Key changes include:- For nodes with the Manager module, the
pingfield now consistently returns 0.0 instead ofNone. This change reflects the negligible round-trip time when the node has the Manager module, clarifying that the node is reachable and avoiding the potential misinterpretation thatNonemight suggest the node is unreachable. - The API response now includes an
agentsfield that provides detailed information about the agents on the node. This field is inAgentSnapshot, which containskind,storedStatus,config, anddraftattributes for each agent.- The
storedStatusfield now replaces the previouspiglet,reconverge, andlearnerfields.storedStatusrepresents the agent's status as stored in the database. With the removal of agent-specific status fields, GraphQL clients now need to use thekindfield to identify the agent type. - The
configanddraftfields replace the oldpigletConfigandhogConfigfields. Providing bothconfiganddraftallows GraphQL clients to clearly differentiate between an agent's active configuration and its draft configuration, offering the flexibility to utilize both sets of information as needed.
- The
- For nodes with the Manager module, the
- Removed
get_node_settingsfunction as it is no longer used. - The
AgentManager::set_configmethod has been removed, due to the new configuration management approach. The central management server no longer sends updates directly to agents. Instead, it notifies them through theupdate_configmethod, prompting agents to request the updated configuration from the management server.
- Corrected the release date of
0.20.0to2024-04-25.
0.20.0 - 2024-04-25
AgentManager::haltmethod to shut down a host.- Add unit test for
nodeStatusListto check ordering of nodes and edges. - Add
validate_and_process_pagination_paramsto check input valid combinations of first, last, before, and after and apply it to GraphQL queries with pagination. - Added
LockyRansomwaredetection event. - Added GraphQL query
resetAdminPasswordto allow resetting the password for an existing user categorized asSystemAdministratorfor administrators utilizing the local network. This feature enhances the security and accessibility of user accounts, providing administrators with a streamlined method for password management.
- GraphQL queries
accountList,allowNetworkList,blockNetworkList,categories,networkList,qualifiers,samplingPolicyList,loadRoundsByModel,statuses,templateList,torExitNodeList,triageResponseList,nodeStatusList,clusters,customerList,dataSourceList,eventList,roundsByCluster,trustedUserAgentList,trustedDomainList,rankedOutliers,savedOutliers,outliers,models,triagePolicyList,nodeListnow explicitly reject user input with combinations of (before, after), (first, before), and (last, after) parameters, following the GraphQL pagination documentation guidelines. This enhancement ensures better consistency and adherence to best practices in handling pagination requests. - GraphQL queries
insertTidbrequiresdbfileto be encoded string ofTidbinstance that is serialized withbincode::DefaultOptions::new().serializeinstead ofbincode::serialize. - GraphQL queries
updateTidbrequiresnewto be encoded string ofTidbinstance that is serialized withbincode::DefaultOptions::new().serializeinstead ofbincode::serialize. - Add the result of
get_configof each module tonodeStatusListGraphQL API. - Use
set_configofAgentManager, instead ofsend_and_recvinapplyNodeGraphQL API. - Use
haltofAgentManager, instead ofsend_and_recvinnodeShutdownGraphQL API. - Updated review-database to 0.27.0.
- Fix the
nodeStatusListGraphQL API to return appropriate results for each field. - Remove
gigantofromNodeStatusstruct andnodeStatusList. - Converted fields in the
nodeStatusListGraphQL API response from returningOption<i64>andOption<u64>to usingStringNumber, likeOption<StringNumber<i64>>andOption<StringNumber<u64>>. This adjustment safeguards against potential data loss resulting from GraphQL's handling ofInttypes. Affected fields aretotal_memory,used_memory,total_disk_space,used_disk_space, andping.
- The implementor of
AgentManageris now responsible for providing the appropriate behavior, becauseAgentManagerno longer provides shared behavior for the following methods:broadcast_crusher_sampling_policyget_process_listget_resource_usagepingreboot
AgentManager::send_and_recvandbroadcast_to_crusherhas been removed because they exposed the underlying communication mechanism to the caller. The caller should now use the specific methods provided byAgentManagerto interact with the agent.AgentManager::defaulthas been removed that returns error.
- Corrected documentation for
NodeStatus::{total_memory, used_memory}to specify that the numbers are in bytes, not in KB.
0.19.0 - 2024-03-18
- Updated the
ModelIndicatorGraphQL type. Addednamefield as the name of the model indicator. - Changed the return type of
indicatorListGraphQL query to[ModelIndicator!]!. - GraphQL query
updateExpirationTimereturns an error if the expiration time is less than one second. init_expiration_timeandupdate_jwt_expires_intakeu32instead ofi64for the expiration time argument.Nodestruct now hassettingsandsettings_draftof typeNodeSettings, andnameandname_draft. Upon initial insertion ofNode,namemust be provided, as it is used as the key ofNodein the database.name_draftandsettings_draftare introduced to support 2-step node-setting process, which is save & apply.name_draftandsettings_draftfields mean that the data are only saved to the database. Once those are applied, the draft values are moved toname, andsettings.- Renamed
updateNodeGraphQL API toupdateNodeDraft, and modified parameter types.oldtoNodeInput, andnewtoNodeDraftInput. graphql::event::convert_sensorsusesNode'ssettingsvalue, to retrieve the hostnames of the sensors. This function is called by GraphQL APIs ofEventQueryandEventGroupQuery.nodeStatusListGraphQL API useshostnamefromNode'ssettingsfield.graphql::node::crud::get_node_settingsusesNode'ssettingsvalue.
- Renamed
- Removed the obsoleted
ModelIndicatorOutputGraphQL type. This type was previously used as return type ofindicatorListGraphQL query. With advancements and improvements in our system, this type is no longer necessary and has been removed to streamline the codebase and enhance overall maintainability.
- Add unit tests to
customer_listto check ordering of nodes and edges. AgentManager::broadcast_crusher_sampling_policymethod to broadcast the sampling policy to the Crusher agents.AgentManager::get_process_listmethod to retrieve the list of processes usage running on host. It returns aVecofgraphql::Process.AgentManager::get_resource_usagemethod to retrieve the resource usage of a host. It returnsgraphql::ResourceUsage.AgentManager::pingmethod to measure the latency between the agent manager and a host.AgentManager::rebootmethod to reboot a host.AgentManager::get_configandAgentManager::set_configmethods to get and set the configuration of an agent.- Add
nodeShutdownGraphQL API. - Introduced
applyNodeGraphQL API, that applies draft values to modules and updates values in database. This API handles partial success of setting application settings, which may happen when a node carries multiple modules. The API returns the list of succeeded modules' names inApplyResult::success_modules.
- Resolved an issue in the
processListquery function where applications were incorrectly identified by their agent ID instead of their application name. Previously, the function assumed the agent ID in the format "agent_id@hostname" directly corresponded to the application name, which was not always the case. This assumption did not support scenarios where multiple instances of the same application ran on the same host with unique agent IDs. The updated implementation now correctly identifies applications by their name, ensuring accurate application prioritization.
0.18.0 - 2024-02-26
- Add
apply_target_idfield toNodestruct for reverting node status. - Add
apply_in_progressfield toNodestruct for reverting node status. - Added the following GraphQL API to access workflow tags:
- 'workflowTagList'
- 'insertWorkflowTag'
- 'removeWorkflowTag'
- 'updateWorkflowTag'
- We've resolved an issue in the GraphQL API where the ordering of edges was
inconsistent when using
last/beforepagination arguments. According to the GraphQL Cursor Connections Specification, the order of edges should remain the same whether usingfirst/afterorlast/before, provided all other arguments are equal. Previously, our API returned edges in reverse order whenlast/beforewas used, which was contrary to the specification. - Resolved a critical bug in the GraphQL API endpoint
updateClusterwhere the user-specifiedstatus_idwas being overwritten whenqualifier_idchange is requested at the same time.- The issue has been addressed to ensure that the user-provided
status_idis now properly respected and retained. - User expecting
status_idchange whenqualifier_idis changed will need to specify desiredqualifier_idwhile updating cluster.
- The issue has been addressed to ensure that the user-provided
- When inserting a new filter using
filters.insert(new.name.clone(), new), the function now checks for conflicts in the filter collection.- If the
new.namealready exists, the function returns an error, preventing unintentional or malicious deletion of any filter. - This fix adds an extra layer of security, ensuring the integrity of the filter collection.
- If the
0.17.0 - 2024-01-19
- Add new
WindowsThreatevent message for Windows sysmon events. - Add new
NetworkThreatevent message for network events. - Add new
ExtraThreatevent message for misc log events.
- Updated review-database to 0.23.0.
0.16.0 - 2024-01-15
- Added
ranked_outlier_streamGraphql API to fetchRankedOutlierperiodically.- Gets the id of the currently stored
Model. - Generate a
RankedOutlieriterator corresponding to the prefix of theModel's id. If not first fetch, generate iterator since the last fetched key. - Stream through the
RankedOutlieriterator, and repeat the behavior after a period of time.
- Gets the id of the currently stored
- Changed
Nodefields. - Updated review-database to 0.22.1.
- Updated
column_statisticsaccording to review-database 0.21.0- Removed
event_rangeargument. - Changed the
timeargument toVec<NaiveDateTime>. - After adjustment,
column_statisticsnow returns all column statistics of the specifiedclusterand created at the batch timestamp listed in thetimeargument. - The timestamp is now added to the return value field
batch_ts, representing the batch timestamp for the specifiedStatistics. - The returned
Statisticsare now sorted according tobatch_tsandcolumn_index.
- Removed
0.15.0 - 2023-11-15
- Change the type of
idinranked_outlier/saved_outlierqueries toStringNumber. - Modified Ranked Outliers graphql query to take in a SearchFilter with
tagandremark - Change the distance search conditions for
ranked outliers.- Start only: Search for outliers with the same distance value
- Start/End: Search for outliers with distance values in the range.
- Change the data type of the
idin theRankedOutlierstructure fromStringNumbertoID. - Change the part about
RankedOutlierTotalCountto count the total count differently depending on whether it issaved_outliersorranked_outliers.
0.14.5 - 2023-11-02
- Modified Ranked Outliers graphql query to take in a SearchFilter with distance range and time range
- Added new method for Ranked Outliers
load_ranked_outliers_with_filter,load_nodes_with_search_filter, anditer_through_search_filter_nodesto load Ranked Outliers depending on new Search Filter.
0.14.4 - 2023-10-19
- Added
processListgraphql query to get the host's list of processes. - Add block list event.
- DceRpc:
BlockListDceRpc - Ftp:
BlockListFtp - Http:
BlockListHttp - Kerberos:
BlockListKerberos - Ldap:
BlockListLdap - Mqtt:
BlockListMqtt - Nfs:
BlockListNfs - Ntlm:
BlockListNtlm - Rdp:
BlockListRdp - Smb:
BlockListSmb - Smtp:
BlockListSmtp - Ssh:
BlockListSsh - tls:
BlockListTls
- DceRpc:
- Updated review-database to 0.20.0.
- Fix to provide multiple
country codes/Customersfor events with multipleaddresses. (RdpBruteForce,MultiHostPortScan,ExternalDdos)
0.14.3 - 2023-09-04
- Refactor the event processing code by separating it into protocol files.
- Modify outlier query to read outlier events from Rocks db.
0.14.2 - 2023-08-22
- Add block list event.
- Conn:
BlockListConn - Dns:
BlockListDns
- Conn:
- Modified
FtpBruteForce,LdapBruteForce,RdpBruteForceevents to align with the event fields provided. - Updated review-database to 0.17.1.
0.14.1 - 2023-07-06
- Supports more events.
- Dns:
CryptocurrencyMiningPool - Ftp:
FtpBruteForce,FtpPlainText - Ldap:
LdapBruteForce,LdapPlainText - Http:
NonBrowser - Session:
PortScan,MultiHostPortScan,ExternalDdos
- Dns:
- Updated review-database to 0.15.2.
0.14.0 - 2023-06-20
- Added five new GraphQL API methods:
trusted_user_agent_list: This new method allows users to retrieve the trusted user agent list.insert_trusted_user_agents: This new feature enables users to insert trusted user agents into the list.remove_trusted_user_agents: Users can now delete trusted user agents from the list using this method.update_trusted_user_agent: This feature has been added to enable users to update the details of a trusted user agent.apply_trusted_user_agent: This new method allows a list of trusted user agents to be applied to allhogassociated withREview.
- The
srcPortanddstPorttypes in bothTorConnectionandRepeatedHttpSessionshave been changed. These types were previously!Stringbut have now been changed to!Int. This change will enhance data consistency and reduce errors related to data type mismatches.
0.13.1 - 2023-06-16
- Reverted an accidantal change made to the serialization of allow/block networks in 0.13.0.
0.13.0 - 2023-06-15
- Updated review-database to 0.15.0.
0.12.0 - 2023-06-10
- Updated review-database to 0.14.1.
0.11.0 - 2023-06-08
- Added new fields to the
Eventenum internal struct provided via GraphQL for enhanceddetect event filtering. This will allow more detailed filtering capabilities in the GraphQL API. - Introduced a
pingfield toNodeStatusstruct, accessible via theNodeStatusListquery. As part of this change, we updated thestatus::loadfunction to include thepingfield in the response of theNodeStatusListquery. This enhancement allows users to retrieve thepingstatus of nodes using the GraphQL API. - Updated the
status::loadfunction to include thepingfield in the response of theNodeStatusListquery. This change enables users to retrieve thepingstatus of nodes via the GraphQL API.
- Modified serialization method in broadcasting of internal networks, allowlist
and blocklist. The new implementation now uses
bincode::DefaultOptions::new().serialize()instead ofbincode::serialize(). This change is aimed at maintaining consistency with other serialized data across our system.
0.10.0 - 2023-05-31
- To enhance security and traceability, we have implemented a new logging
feature which now writes a log message during specific user authentication
activities.
- User Sign-in Logging: A log message will be automatically generated each time a user signs in successfully.
- User Sign-out Logging: In addition to sign-ins, we now log user sign-out events.
- Sign-in Failure Logging: In an effort to help detect and mitigate potential security issues, we are now logging failed sign-in attempts. This includes the user identification (if applicable) and the reason for failure (e.g., incorrect password, non-existent user ID, etc.).
- Added
eventstreamGraphql API to fetch events periodically.- Based on the
starttime, look for events inEventDbthat meet the criteria and stream them. - After a period of time, look up the
EventDbagain, find the newly added events, stream them, and keep repeating.
- Based on the
- Updated review-database to 0.13.2.
0.9.1 - 2023-05-25
- The
DomainGenerationAlgorithmevent in ourGraphQLAPI query now includes a confidence field. This field will allow users to access and gauge the predictive certainty of the output. AgentManagertrait has been extended with three new methods.broadcast_internal_networks: This method is responsible for broadcasting the customer's network details, including intranet, extranet, and gateway IP addresses to clients.broadcast_allow_networks: This method sends the IP addresses that are always accepted as benign to the clients.broadcast_block_networks: This method broadcasts the IP addresses that are always considered suspicious.
- Four new functions have been added to the
graphqlmodule to assist with the implementation of theAgentManagertrait:graphql::get_allow_networks: Fetches the list of IP addresses that are always accepted as benign.graphql::get_block_networks: Fetches the list of IP addresses that are always considered suspicious.graphql::get_customer_networks: Gets the customer's network details, including intranet, extranet, and gateway IP addresses.get_customer_id_of_review_host: Returns the customer ID associated with the review host.
- Two new GraphQL API methods have been added:
applyAllowNetworks: Applies the list of IP addresses that are always accepted as benign.applyBlockNetworks: Applies the list of IP addresses that are always considered suspicious.
- The behavior when a new node is added or the customer of a node is changed, has been updated to broadcast the customer networks of the node.
- If the customer networks of a node are updated, the changes are now broadcast. This provides an additional layer of communication to keep the system up-to-date with changes.
0.9.0 - 2023-05-22
- Updated review-database to 0.12.0.
- Starting from this version, the policy field for TimeSeries data will be set to the same value as the source field. For other data types, the policy field will be set to null.
0.8.1 - 2023-05-18
- The
update_traffic_filter_rulesfunction has been updated to explicitly take ahost_idas an argument, replacing the previousagent_id@host_idargument format. - Allows the clearing of filtering rules at an agent level by sending an empty rule set to the agent.
0.8.0 - 2023-05-18
- Extended
HttpThreatobject in the GraphQL API:- The
HttpThreatobject now exposes additional fields which encompass all the fields present in an HTTP request. Details of these additional fields can be found in the updated schema. - Introduced a new field, matched_to, within the
HttpThreatobject. This field presents all the patterns that correspond with the HTTP request.
- The
- Updated review-database to 0.11.0.
0.7.0 - 2023-05-16
- Updated review-database to 0.10.1.
0.6.0 - 2023-05-15
- Added
kindfield to the return values ofdataSourceListAPI.
- From the GraphQL APIs
signInandrefreshToken, the username field has been removed from theAuthPayloadreturn object. This is due to redundancy as the caller ofsignInorrefreshTokenalready possesses knowledge of the username. - Updated review-database to 0.9.0.
0.5.0 - 2023-05-08
- Updated review-database to 0.8.0.
- Resolved an issue with the GraphQL query
clustersthat was introduced in version 0.4.0 due to a database schema change. Theclustersquery is now functional again, allowing users to retrieve cluster data as expected.
0.4.1 - 2023-05-05
- Added a GraphQL query,
rankedOutliers, to retrieve outliers.
0.4.0 - 2023-05-04
- Updated
review-databaseto 0.7.1.
0.3.0 - 2023-05-02
- Updated
ip2locationto 0.4.2. - Updated
review-databaseto 0.7.0. - GraphQL API
columnStatistics: This query's parameters have been modified to support event source.- Replaced separate firstEventId: Int and lastEventId: Int parameters with a single eventRange: EventRangeInput parameter.
- EventRangeInput is a new input type that includes the following required
fields:
- firstEventId: !Int (equivalent to the previous firstEventId parameter).
- lastEventId: !Int (equivalent to the previous lastEventId parameter).
- eventSource: !String (a new required field indicating the source of the events).
0.2.0 - 2023-04-27
- Added
port/procotolto traffic filter rule to filter traffic in Piglet.
0.1.0 - 2023-04-24
- An initial version.