Skip to content

cssnr/virustotal-action

Use this GitHub action with your project
Add this Action to an existing workflow or create a new one
View on Marketplace

Repository files navigation

Tags Test Quality Gate Status GitHub Release Version GitHub Last Commit Codeberg Last Commit GitHub Top Language GitHub Org Stars Discord

VirusTotal Action

Upload Release Assets or Specified File Globs to VirusTotal and Optionally Update Release Notes with Links.

Note

Please submit a Feature Request for new features or Open an Issue if you find any bugs.

The /files/ endpoint is used for files under 32MB, otherwise, the /files/upload_url/ endpoint is used providing support for files up to 650MB. Therefore, files over 32MB will consume 2 API calls.

Inputs

input required default description
github_token Yes - GitHub Token: ${{ secrets.GITHUB_TOKEN }}
vt_api_key Yes - VirusTotal API Key from VirusTotal *
file_globs No - File Globs to Process, newline seperated *
rate_limit No 4 API Calls Per Minute, 0 to disable
update_release No true Update Release Notes, false to disable

vt_api_key - Get your API key from: https://www.virustotal.com/gui/my-apikey

file_globs - For glob pattern examples, see: https://github.com/actions/toolkit/tree/main/packages/glob#patterns

- name: 'VirusTotal'
  uses: cssnr/virustotal-action@v1
  with:
      github_token: ${{ secrets.GITHUB_TOKEN }}
      vt_api_key: ${{ secrets.VT_API_KEY }}

Update Release

The Update Release option will append text similar to this to the release body:


🛡️ VirusTotal Results:


Outputs

output description
results Comma Seperated String of file/id

Example Output:

install-linux.deb/ZDAzY2M2ZGQzZmEwZWEwZTI2NjQ5NmVjZDcwZmY0YTY6MTcxNzU2NzI3Ng==,install-macos.pkg/YTkzOGFjMDZhNTI3NmU5MmI4YzQzNzg5ODE3OGRkMzg6MTcxNzU2NzI3OA==,install-win.exe/M2JhZDJhMzRhYjcyM2Y0MDFkNjU1OGZlYjFkNjgyMmY6MTcxNzU2NzI4MA==
- name: 'VirusTotal'
  uses: cssnr/virustotal-action@v1
  id: vt
  with:
      github_token: ${{ secrets.GITHUB_TOKEN }}
      vt_api_key: ${{ secrets.VT_API_KEY }}

- name: 'Echo Results'
  run: echo ${{ steps.vt.outputs.results }}

Examples

With File Globs:

- name: 'VirusTotal'
  uses: cssnr/virustotal-action@v1
  with:
      github_token: ${{ secrets.GITHUB_TOKEN }}
      vt_api_key: ${{ secrets.VT_API_KEY }}
      file_globs: artifacts/*

Multiple Globs:

- name: 'VirusTotal'
  uses: cssnr/virustotal-action@v1
  with:
      github_token: ${{ secrets.GITHUB_TOKEN }}
      vt_api_key: ${{ secrets.VT_API_KEY }}
      file_globs: |
          artifacts/*
          assets/asset.zip

Simple Example:

name: 'VirusTotal Example'

on:
    release:
        types: [published]

jobs:
    test:
        name: 'Test'
        runs-on: ubuntu-latest
        timeout-minutes: 5

        steps:
            - name: 'VirusTotal'
              uses: cssnr/virustotal-action@v1
              with:
                  github_token: ${{ secrets.GITHUB_TOKEN }}
                  vt_api_key: ${{ secrets.VT_API_KEY }}

Full Example:

name: 'VirusTotal Example'

on:
    release:
        types: [published]

jobs:
    windows:
        name: 'Windows Build'
        runs-on: windows-latest
        timeout-minutes: 5

        steps:
            - name: 'Checkout'
              uses: actions/checkout@v4

            - name: 'Build'
              uses: Minionguyjpro/Inno-Setup-Action@v1.2.2
              with:
                  path: client.iss
                  options: '/DMyAppVersion=${{ github.ref_name }}'

            - name: 'Upload to Release'
              uses: svenstaro/upload-release-action@v2
              if: ${{ github.event_name == 'release' }}
              with:
                  repo_token: ${{ secrets.GITHUB_TOKEN }}
                  file: out/*
                  tag: ${{ github.ref }}
                  overwrite: true
                  file_glob: true

    virustotal:
        name: 'VirusTotal Scan'
        runs-on: ubuntu-latest
        needs: [windows]
        timeout-minutes: 5
        if: ${{ github.event_name == 'release' }}

        steps:
            - name: 'VirusTotal'
              uses: cssnr/virustotal-action@v1
              with:
                  github_token: ${{ secrets.GITHUB_TOKEN }}
                  vt_api_key: ${{ secrets.VT_API_KEY }}
                  rate_limit: 4
                  update_release: true

To see this used in a build/release/scan workflow, check out:
https://github.com/cssnr/hls-downloader-client/blob/master/.github/workflows/build.yaml

Planned Features

  • Add release body parsing to properly process new files on edited activity.
  • Add workflow summary to workflow results.
  • Add options to customize release update format.

Support

For general help or to request a feature see:

If you are experiencing an issue/bug or getting unexpected results you can:

Contributing

Currently, the best way to contribute to this project is to star this project on GitHub.

Additionally, you can support other GitHub Actions I have published:

For a full list of current projects to support visit: https://cssnr.github.io/