Skip to content
Please update to the latest release 0.77.3 to address Multiple CVEs.
Server.Utils.DeleteManyFlows

Server.Utils.DeleteManyFlows

Removes old or unwanted flows from the server based on configurable filters with a dry-run mode.

Sometimes the Velociraptor server accumulates a lot of data that is no longer needed. This artifact will enumerate all flows from all clients and matches them against some criteria. Flows that match are then removed.

NOTE: This artifact will destroy all data irrevocably. Take care! You should always do a dry run first to see which flows will match before using the ReallyDoIt option.


name: Server.Utils.DeleteManyFlows
description: |
  Removes old or unwanted flows from the server based on configurable
  filters with a dry-run mode.
   
  Sometimes the Velociraptor server accumulates a lot of data that is
  no longer needed. This artifact will enumerate all flows from all
  clients and matches them against some criteria. Flows that match are
  then removed.

  **NOTE:** This artifact will destroy all data irrevocably. Take
  care! You should always do a dry run first to see which flows will
  match before using the `ReallyDoIt` option.

type: SERVER

parameters:
   - name: ArtifactRegex
     default: Generic.Client.Info
     type: regex
   - name: HostnameRegex
     description: If specified only target these hosts
     type: regex
   - name: DateBefore
     description: Only select flows created before this date. If not set we choose all flows.
     type: timestamp
   - name: CreatorRegex
     default: "."
     type: regex
     description: |
       Match flows created by this user.
   - name: ReallyDoIt
     type: bool
     description: Does not delete until you press the ReallyDoIt button!

sources:
  - query: |
        LET DateBefore <= DateBefore || timestamp(epoch=now())
        LET hits = SELECT * FROM foreach(row={
            SELECT client_id,
                   os_info.hostname AS hostname
            FROM clients()
            WHERE hostname =~ HostnameRegex
        },
        query={
          SELECT client_id, hostname,
                 session_id, request.creator AS creator,
                 request.artifacts as artifacts,
                 timestamp(epoch=create_time) AS created
          FROM flows(client_id=client_id)
          WHERE creator =~ CreatorRegex
             AND artifacts =~ ArtifactRegex
             AND created < DateBefore
        }, workers=10)

        SELECT * FROM if(condition=ReallyDoIt,
        then={
            SELECT * FROM foreach(row=hits,
            query={
                SELECT client_id, hostname, creator,
                       session_id, artifacts, created, Type, Data, Error
                FROM delete_flow(client_id=client_id,
                        flow_id=session_id, really_do_it=ReallyDoIt)
                WHERE log(message=format(format="Deleting flow %v from %v",
                   args=[session_id, hostname]))
            }, workers=10)
        }, else={
            SELECT * FROM hits
        })