T1219.001

IDE Tunneling

Adversaries may abuse Integrated Development Environment (IDE) software with remote development features to establish an interactive command and control channel on target systems within a network. IDE tunneling combines SSH, port forwarding, file sharing, and debugging into a single secure connection, letting developers work on remote systems as if they were local. Unlike SSH and port forwarding, IDE tunneling encapsulates an entire session and may use proprietary tunneling protocols alongside SSH, allowing adversaries to blend in with legitimate development workflows. Some IDEs, like Visual Studio Code, provide CLI tools (e.g., code tunnel) that adversaries may use to programmatically establish tunnels and generate web-accessible URLs for remote access. These tunnels can be authenticated through accounts such as GitHub, enabling the adversary to control the compromised system via a legitimate developer portal.

Microsoft Sentinel / Defender
kusto
let IDETunnelProcesses = dynamic([
  "code.exe", "code-tunnel.exe", "code-insiders.exe",
  "code", "code-tunnel",
  "devtunnel.exe", "devtunnel",
  "jetbrains-gateway.exe", "gateway.exe",
  "remote-dev-server.sh", "idea.sh", "pycharm.sh",
  "cursor.exe", "cursor",
  "windsurf.exe"
]);
let TunnelArguments = dynamic([
  "tunnel", "--remote-tunnel", "serve-web",
  "tunnel --accept-server-license-terms",
  "remote-ssh", "dev-tunnel",
  "--host 0.0.0.0"
]);
let TunnelDomains = dynamic([
  "tunnels.api.visualstudio.com", "global.rel.tunnels.api.visualstudio.com",
  "devtunnels.ms", ".tunnels.api.visualstudio.com",
  "vscode.dev", "*.vscode.dev",
  "code.visualstudio.com",
  "gateway.jetbrains.com", "code-server.dev"
]);
DeviceProcessEvents
| where Timestamp > ago(24h)
| where FileName has_any (IDETunnelProcesses)
    or ProcessCommandLine has_any (TunnelArguments)
| extend IsTunnelCommand = ProcessCommandLine has "tunnel"
| extend IsCodeCLI = FileName in~ ("code.exe", "code", "code-tunnel.exe", "code-tunnel", "code-insiders.exe")
| extend IsJetBrains = FileName has_any ("jetbrains-gateway", "gateway.exe", "remote-dev-server", "idea", "pycharm")
| extend HasGitHubAuth = ProcessCommandLine has_any ("--github", "github", "--provider github")
| extend IsHeadless = ProcessCommandLine has_any ("--cli", "--no-browser", "--accept-server-license-terms", "serve-web")
| project Timestamp, DeviceName, AccountName, FileName, ProcessCommandLine,
         InitiatingProcessFileName, InitiatingProcessCommandLine,
         IsTunnelCommand, IsCodeCLI, IsJetBrains, HasGitHubAuth, IsHeadless
| sort by Timestamp desc
high severity high confidence

Data Sources

Process: Process Creation Command: Command Execution Network Traffic: Network Connection Creation Microsoft Defender for Endpoint

Required Tables

DeviceProcessEvents

False Positives

  • Software developers using VS Code Remote Development extension to work on remote servers or containers as part of normal development workflows
  • DevOps engineers using JetBrains Gateway to connect to remote build servers or cloud development environments (GitHub Codespaces, Gitpod)
  • CI/CD pipeline agents that invoke VS Code CLI or DevTunnel for automated testing or deployment tasks
  • IT administrators using VS Code tunnel to remotely troubleshoot servers from their workstations

Unlock Pro Content

Get the full detection package for T1219.001 including response playbook, investigation guide, and atomic red team tests.

Response PlaybookInvestigation GuideHunting QueriesAtomic Red Team TestsTuning Guidance

Related Detections