Submitting samples

Note: The sample submission endpoint is currently being extended to allow for fine-grained control over analyses without the use of profiles. Stay tuned for updates.

POST /samples

This endpoint allows both files and URLs to be submitted. Samples can be submitted using automatic mode for high-volume analysis, as well as interactive mode. In interactive mode, you must manually choose how to analyze the sample after static analysis of the sample has completed.

Required fields

Key Type Description
kind String One of: file, url or fetch

Optional fields

Key Type Default Description
file File The uploaded file. Requires kind to be set to "file"
interactive Boolean false If set to true, the analysis profile must be chosen manually after static analysis has finished
password String A password that may be used to decrypt the provided file, usually an archive (zip/rar/etc)
profiles Array A mapping of one or more files to one or more profiles
url String The URL to use as sample. Requires kind to be set to "url" or "fetch"
defaults.timeout Int The timeout in seconds for behavioral analysis (maximum 3600)
defaults.network String internet Controls internet connectivity type for behavioral analysis

If interactive is set to true, analysis pauses when the sample status reaches static_analysis. To continue, you must manually start the analysis.

JSON example

The following object describes the parameters one could specify in their submission:

{
    // Optionally specify the kind of submission this is. If not defined, kind
    // is inferred from the other parameters. See below for examples of each
    // type of submission.
    "kind": "file" | "url" | "fetch" | "import",

    // Submit a URL to use as sample. If kind is "fetch", the URL is downloaded
    // as file instead of executed directly in a browser.
    "url": "http://example.com/malware.exe",

    // Optional: manually specify the filename of the sample. If not specified,
    // the filename of the attached file is used. Not applicable to "url"
    "target": "my-malware.exe",

    // Optional: defaults to false.  If set to true, the analysis profile must be
    // chosen manually after static analysis has finished.
    "interactive": false,

    // Optional: A password that may be used to decrypt the provided file,
    // usually an archive (zip/rar/etc).
    "password": "infected",

    // Optional: A mapping of one or more files to one or more profiles.
    "profiles": [...],

    // Experimental: an optional array of user-defined strings that lets the
    // user mark a sample. The resulting tags will be embedded in the reports.
    // The total size cannot exceed 1kB and tags cannot be empty.
    "user_tags": ["id:123789", "source:smtp"],

    // The optional defaults object specifies base parameters to use for
    // automatic analysis.
    "defaults": {
        // Optional: Specify the timeout of the analysis (in seconds, maximum 3600).
        "timeout": 60,

        // Optional: defaults to "internet". Specify the type of network
        // routing to use in behavioral analysis.
        "network": "internet" | "drop" | "tor"
    }
}

Submitting a file

File submissions are required to be performed using the multipart/form-data scheme. The field name of uploaded file should be file and the file should have a filename. Optionally override the filename with the target field.

Because submitting a JSON payload when submitting a multipart upload can be difficult, the submission parameters can be submitted in one of two ways:

  • For simple submissions, encode the parameters as form values instead of JSON. Nested objects can be specified with a period (e.g. defaults.network). Array fields can be specified multiple times.
  • Alternatively, the JSON parameter payload can be encoded as a form field with key _json.

See below for examples.

File submission examples

Submitting a file:

$ curl -H 'Authorization: Bearer <YOUR_ACCESS_KEY>' \
    -F 'file=@<YOUR_SAMPLE_FILE_PATH>' \
    https://tria.ge/api/v0/samples
// Response:
{
  "id": "190724-hakvlwz8cx",
  "status": "running",
  "kind": "file",
  "filename": "evil.bat",
  "private": true,
  "submitted": "2019-07-24T13:32:07.253524Z"
}

Submitting a file with JSON parameters:

$ curl -H 'Authorization: Bearer <YOUR_ACCESS_KEY>' \
    -F '_json={"kind":"file","defaults":{"timeout": 60, "network":"drop"}}' \
    -F 'file=@<YOUR_SAMPLE_FILE_PATH>' \
    https://tria.ge/api/v0/samples

Submitting a password-protected .zip file:

$ curl -H 'Authorization: Bearer <YOUR_ACCESS_KEY>' \
    -F password=mysecret \
    -F 'file=@<YOUR_ZIP_FILE_PATH>' \
    https://tria.ge/api/v0/samples

Submitting a file with custom filename, user tags, and Tor network routing:

$ curl -H 'Authorization: Bearer <YOUR_ACCESS_KEY>' \
    -F target=custom-filename.bat \
    -F user_tags=4e2000db-6b18-4c25-9876-748aaa808a32 \
    -F user_tags=source:1234 \
    -F default.network=tor \
    -F 'file=@<YOUR_ZIP_FILE_PATH>' \
    https://tria.ge/api/v0/samples

Submitting a URL

To submit a URL, you must do one of the following:

  • Set the "url" parameter
  • Specify "kind" to be "url" and "target" to be the URL

It's not possible to mix file upload and URL submissions.

Fetching a sample from a URL

In some use-cases it's desirable to submit a URL from which Triage will download the sample itself. E.g., the sample could be located in AWS S3, your own website, etc.

To have Triage fetch the sample from a URL, you must set kind to "fetch" and include the URL of the sample as url or target.

URL submission examples

Submitting a URL:

$ curl -H 'Authorization: Bearer <YOUR_ACCESS_KEY>' \
    -F url=http://example.org/ \
    https://tria.ge/api/v0/samples

Fetching a sample from a URL:

# As form:
$ curl -H 'Authorization: Bearer <YOUR_ACCESS_KEY>' \
    -F kind=fetch \
    -F url=https://hostname.tld/sample.exe \
    https://tria.ge/api/v0/samples

# As JSON:
$ curl -H 'Authorization: Bearer <YOUR_ACCESS_KEY>' \
    -H 'Content-Type: application/json' \
    -d '{"kind": "fetch", "url": "https://hostname.tld/sample.exe"}'
    https://tria.ge/api/v0/samples

It's also possible to import an analysis from the public cloud:

$ curl -H 'Authorization: Bearer <YOUR_ACCESS_KEY>' \
    -F kind=import \
    -F url=https://tria.ge/220202-rs4ehsacen \
    https://tria.ge/api/v0/samples

Note that you can also specify just the sample/analysis ID (in this case "220202-rs4ehsacen") instead of the full https://tria.ge/ URL.

Choosing a profile

Choosing a profile is only available to users that are registered with a company.

Selecting a profile allows more to control over the virtual environment that is used to run the sample. Selecting a profile requires interactive to be false. Profiles can be selected by adding them to the profiles array as shown below:

{
  "profiles": [
    {
      // The ID or name of the profile to use.
      "profile": "myprofilename",
      // If an archive is submitted, specify the filename in the archive this
      // profile should be used for (as per this example). This field can be
      // omitted if a single file is submitted (alternatively "sample" also
      // selects the submitted file).
      "pick": "unpack001/something.exe"
    }
  ],
  // Other options
}

A file may be selected multiple times with different profiles so it will be executed in different environments.

Please refer to the documentation for POST /samples/{sampleID}/profile.