BurpSense
[](https://github.com/TheArqsz/BurpSense/actions/workflows/release.yml)
BurpSense bridges the gap between security testing in Burp Suite and your development environment in VS Code. The core idea is simple: instead of constantly switching between tools to cross-reference vulnerabilities with source code, you can map Burp's findings directly to the lines where issues occur. This gives you inline diagnostics, full advisory details and a persistent record of what needs attention.
What this solves?If you've done web application security testing, you've probably experienced the friction of correlating Burp Suite findings with actual source code. You find an SQL injection, note the URL and parameter, then hunt through your codebase to figure out where that endpoint lives. Then you need to remember which file and line to fix, or worse, communicate this to someone else on your team who wasn't sitting next to you during testing. Burp Suite does have a built-in API integration feature, but if you've tried using it, you know it's... let's say "minimalist".
The extension eliminates most of this friction. The Burp bridge exposes scan results through a clean local API and the VS Code extension consumes them in real-time. You get a live view of all findings and you can annotate specific lines of code with issues. These annotations persist in your workspace, so you can pick up where you left off without losing context. How it works?The project has two components: The Burp bridge is a Java extension that runs inside Burp Suite. It starts an HTTP server on The VS Code extension connects to this bridge and displays issues in a dedicated tree view. You can browse, search, and filter findings, then map them to specific lines in your source files. Mapped issues appear as diagnostics in the Problems panel, and clicking on one opens a detailed advisory with full HTTP request/response data. When you refactor code and lines move around, the extension attempts to track those changes and adjust mappings automatically. Communication happens over HTTP for queries and WebSocket for real-time updates. The protocol is differential - after the initial sync, the bridge only sends what's changed (new issues, removed issues) rather than the entire dataset each time. Installation and setupBridge extension (Burp Suite side)
Start by building the bridge:
This produces Generate an API token using the "Generate New Key" button and copy it somewhere safe. Then click "Start Server" to begin listening. By default, the server binds to
VS Code extensionYou can install from VSCode Marketplace, Open VSX Registry, a packaged VSIX or run from source: From VSIX:
This creates From source (for development):
Then press Connecting the twoAfter installing both components, run Using the extensionBrowsing issuesThe BurpSense view appears in the activity bar (the shield icon on the left side). Opening it shows a tree of issues organized by severity. Each issue displays its name, confidence level, and affected URL. The tree uses lazy loading, so it stays responsive even when you have hundreds of findings. You can filter issues in several ways:
The toolbar icons let you adjust these filters on the fly. There's also a "quick filter" menu that applies common presets like "high severity only" or "in-scope high and medium". Mapping issues to codeTo map an issue to a line of code:
The mapping gets saved to Mapped issues appear in two places: the Problems panel (with appropriate severity icons) and directly in the editor as squiggly underlines. Click any diagnostic to open a detailed advisory showing the full issue description, remediation advice, and HTTP traffic if available.
Drift detection
When you refactor code, lines move around. BurpSense tries to keep mappings accurate by checking whether the text you originally mapped still exists nearby. When you edit a file with mappings, the extension:
This works well for typical refactoring like adding functions or moving code blocks. It won't track cases where you completely rewrite the vulnerable code, but that's intentional - if the code changed that much, the original issue may no longer apply and you should verify it manually. The extension can notify you when it adjusts mappings, though you can disable these notifications in settings if they're distracting. Removing mappingsRemove a single mapping by right-clicking the line and selecting Sharing mappings with your teamThe mappings file ( You can also export mappings to a standalone JSON file and import them in a different workspace if needed with dedicated commands. ConfigurationSettings live in VS Code preferences under the "BurpSense" section:
The IP and port should match where your bridge is listening. If you're running Burp on a different machine, adjust accordingly. The extension will reconnect automatically when these settings change. Filter settings (severity, confidence, scope) apply server-side, which means the bridge only sends issues matching your criteria. Changing filters triggers a refetch, so there might be a brief delay while the new filtered set loads. Drift notifications can be disabled if you find them noisy. The extension will still adjust mappings, just without notifying you. Auto-clean orphaned mappings, when enabled, removes mappings for files that get deleted. This is disabled by default because you might temporarily remove files during refactoring and want the mappings to persist. Technical detailsSynchronization protocolThe extension uses a hybrid push/pull model. On initial load, it fetches all issues via
This differential sync significantly reduces network traffic during active scanning sessions where issues frequently appear and disappear. WebSocket connections handle real-time updates. The bridge monitors its issue list every 2 seconds and broadcasts a refresh message when the count changes. Clients respond by fetching an incremental update. Caching strategyIssues are cached locally with a 30 second TTL. After expiration, the tree view fetches fresh data the next time you expand a node. This avoids hammering the bridge with requests while keeping the display reasonably current. The cache has two levels:
When an incremental update arrives, both caches are invalidated, but the tree doesn't refetch unless something actually changed. This keeps the UI responsive even during heavy scanning activity. Performance characteristicsThe initial load with several hundred issues can take a few seconds while the tree builds its internal structure. After that, navigation is fast because the tree uses lazy loading - child nodes aren't created until you expand their parent. The extension processes incremental updates synchronously, which means if you have a large removal event (like changing filters to exclude 500 issues), there might be a noticeable pause. This is a trade-off for keeping the sync logic simple. Known quirks and limitationsManual disconnect behaviorIf you manually disconnect using the status bar, the extension won't fetch data for any operation, including opening issue details. This is intentional - when you're disconnected, you're working with stale cache only. Reconnecting re-enables all fetches. Cache invalidation timingWhen the cache expires (after 30 seconds), the extension doesn't immediately refetch. It waits until you next interact with the tree view. This is by design to avoid background fetches when you're not actively looking at the extension. Large issue setsWith 1000+ issues, the tree can feel sluggish. This is partly because VS Code's tree view API isn't optimized for that many items, and partly because the grouping logic has to sort and organize everything. Consider using stricter filters to reduce the working set. WebSocket reconnection gapIf the Burp bridge restarts, the WebSocket takes a few seconds to reconnect. During this window, you won't receive real-time updates, though the extension continues working with cached data. Once the connection re-establishes, you'll get an incremental sync of anything that changed. Mapping file formatThe mappings file is plain JSON and gets rewritten entirely on every change. This means if two people edit mappings simultaneously, the last write wins. Git can handle this in most cases, but be aware that mappings don't merge intelligently across branches. TroubleshootingStatus bar shows "Not Connected"Work through these in order:
The status bar is clickable and opens a quick actions menu with diagnostics. Check the VS Code output panel for connection logs. Issues aren't showing upFirst, verify the issues actually exist in Burp's sitemap. Then check your filter settings - you might have the minimum severity set too high, or scope filtering enabled when the issues aren't in scope. Try clicking the refresh button in the tree view toolbar. If that doesn't work, check the output panel for errors. Mappings not appearing as diagnosticsMake sure the file path in the mappings matches your workspace structure exactly. The extension uses paths relative to the workspace root, so if your workspace root isn't what you expect, mappings might not resolve. Check Drift detection moving mappings incorrectlyThe similarity algorithm is conservative (80% match threshold), but false positives can still happen if you have very similar code repeated in nearby lines. If drift detection is causing problems, you can turn off notifications in settings. The extension will still adjust mappings, but you can check the Problems panel to verify they're still pointing to the right code. Development and contributingTo build from source, you need Maven for the bridge and Node.js for the extension. Bridge
Output is in Extension
For active development, use Issues and pull requests are welcome. For major changes, please open an issue first to discuss the approach. When reporting bugs, include VS Code and Burp Suite versions, extension version, and logs from both components (VS Code output panel and Burp's extension output tab). Project structure
LicenseAcknowledgmentsBuilt using Burp Suite's Montoya API, Undertow for HTTP/WebSocket serving and node-fetch/ws for client networking. |







