Detection rules › Sigma

Renamed Visual Studio Code Tunnel Execution

Status
test
Severity
high
Log source
product windows, category process_creation
Author
Nasreddine Bencherchali (Nextron Systems)
Source
github.com/SigmaHQ/sigma

Detects renamed Visual Studio Code tunnel execution. Attackers can abuse this functionality to establish a C2 channel

MITRE ATT&CK coverage

Event coverage

ProviderEventTitle
SysmonEvent ID 1Process creation

Rule body yaml

title: Renamed Visual Studio Code Tunnel Execution
id: 2cf29f11-e356-4f61-98c0-1bdb9393d6da
status: test
description: Detects renamed Visual Studio Code tunnel execution. Attackers can abuse this functionality to establish a C2 channel
references:
    - https://ipfyx.fr/post/visual-studio-code-tunnel/
    - https://badoption.eu/blog/2023/01/31/code_c2.html
    - https://code.visualstudio.com/docs/remote/tunnels
author: Nasreddine Bencherchali (Nextron Systems)
date: 2023-09-28
modified: 2025-10-29
tags:
    - attack.command-and-control
    - attack.t1071.001
    - attack.t1219
logsource:
    category: process_creation
    product: windows
detection:
    selection_image_only_tunnel:
        OriginalFileName: null
        CommandLine|endswith: '.exe tunnel'
    selection_image_tunnel_args:
        CommandLine|contains|all:
            - '.exe tunnel'
            - '--accept-server-license-terms'
    selection_image_tunnel_service:
        CommandLine|contains|all:
            - 'tunnel '
            - 'service'
            - 'internal-run'
            - 'tunnel-service.log'
    selection_parent_tunnel:
        ParentCommandLine|endswith: ' tunnel'
        Image|endswith: '\cmd.exe'
        CommandLine|contains|all:
            - '/d /c '
            - '\servers\Stable-'
            - 'code-server.cmd'
    filter_main_parent_code:
        ParentImage|endswith:
            - '\code-tunnel.exe'
            - '\code.exe'
    filter_main_image_code:
        Image|endswith:
            - '\code-tunnel.exe'
            - '\code.exe'
    condition: (1 of selection_image_* and not 1 of filter_main_image_*) or (selection_parent_tunnel and not 1 of filter_main_parent_*)
falsepositives:
    - Unknown
level: high

Stages and Predicates

Stage 0: condition

(1 of selection_image_* and not 1 of filter_main_image_*) or (selection_parent_tunnel and not 1 of filter_main_parent_*)

Stage 1: selection_image_only_tunnel

selection_image_only_tunnel:
    OriginalFileName: null
    CommandLine|endswith: '.exe tunnel'

Stage 2: selection_image_tunnel_args

selection_image_tunnel_args:
    CommandLine|contains|all:
        - '.exe tunnel'
        - '--accept-server-license-terms'

Stage 3: selection_image_tunnel_service

selection_image_tunnel_service:
    CommandLine|contains|all:
        - 'tunnel '
        - 'service'
        - 'internal-run'
        - 'tunnel-service.log'

Stage 4: not filter_main_image_code

filter_main_image_code:
    Image|endswith:
        - '\code-tunnel.exe'
        - '\code.exe'

Stage 5: selection_parent_tunnel

selection_parent_tunnel:
    ParentCommandLine|endswith: ' tunnel'
    Image|endswith: '\cmd.exe'
    CommandLine|contains|all:
        - '/d /c '
        - '\servers\Stable-'
        - 'code-server.cmd'

Stage 6: not filter_main_parent_code

filter_main_parent_code:
    ParentImage|endswith:
        - '\code-tunnel.exe'
        - '\code.exe'

Exclusions

Top-level NOT(...) conjuncts: predicates this rule actively suppresses.

FieldKindExcluded values
Imageends_with\code-tunnel.exe
Imageends_with\code.exe
ParentImageends_with\code-tunnel.exe
ParentImageends_with\code.exe

Indicators

Each row is a field, operator, and value that the rule matches. The corpus column counts how many other rules in the catalog look for the same combination: high numbers point to widely-used, community-vetted indicators. Blank or 1 shows that the indicator is specific to this rule.

FieldKindValues
CommandLineends_with
  • .exe tunnel corpus 2 (sigma 2)
CommandLinematch
  • --accept-server-license-terms corpus 4 (sigma 3, splunk 1)
  • .exe tunnel corpus 2 (sigma 2)
  • /d /c corpus 2 (sigma 2)
  • \servers\Stable- corpus 2 (sigma 2)
  • code-server.cmd corpus 3 (sigma 2, splunk 1)
  • internal-run corpus 2 (sigma 2)
  • service corpus 5 (sigma 4, splunk 1)
  • tunnel corpus 2 (sigma 2)
  • tunnel-service.log corpus 2 (sigma 2)
Imageends_with
  • \cmd.exe corpus 130 (sigma 130)
OriginalFileNameis_null
  • (no value, null check)
ParentCommandLineends_with
  • tunnel corpus 2 (sigma 2)