Skip to content
Notifications
Clear all

Check out this weird false positive: S1 flagging our in-house compiler.

14 Posts
13 Users
0 Reactions
10 Views
(@data_pipeline_tinker)
Honorable Member
Joined: 5 months ago
Posts: 364
Topic starter   [#25783]

We've been running SentinelOne Singularity Complete across our data engineering and analytics infrastructure for about nine months now, primarily for its robust behavioral AI capabilities on our fleet of Linux-based pipeline servers. The integration has been largely seamless, until last Thursday when our nightly data warehouse refresh jobs began failing en masse. After a significant amount of triage, we isolated the cause to SentinelOne placing our custom, in-house data transformation compiler into quarantine.

This compiler is a critical piece of internal tooling. It's a Python application that takes declarative data transformation specs (JSON/YAML) and compiles them into optimized, orchestrated DAGs of SQL (for dbt) and Python (for Apache Airflow) code. It's not publicly distributed, resides on a secured network share, and its SHA256 hashes are well-documented in our internal artifact registry.

The incident manifested with the following S1 Deep Visibility query, which pinpointed the moment of detection:

```sql
-- Deep Visibility Query
SELECT event_type, event_subtype, process_path, threat_name, timestamp
FROM dv_events
WHERE process_path LIKE '%internal_data_compiler.py'
AND timestamp > '2024-05-15 02:00:00'
ORDER BY timestamp DESC
LIMIT 10;
```

The result showed a `Malicious Tool` classification. The specific indicators cited were behavioral:
* Process spawning a `gcc` subprocess (it compiles some C-based templating libraries).
* The subsequent `gcc` process writing a new executable to `/tmp/`.
* The original compiler process making a network call to our internal artifact server to log the build.

From a pure behavioral standpoint, I can see the correlation: a process that compiles code and then performs network activity. However, the context is completely legitimate. This has forced us into a detailed exemption process, which involves:
1. Submitting the file to our IT security team for static analysis.
2. Adding a global exclusion policy for the specific path and hash.
3. Creating a custom hash-based allow rule within the S1 management console.

This raises a substantive discussion point for other data teams: **How are you managing exemptions for legitimate, in-house developed tools that exhibit "noisy" behavioral patterns?** The balance between security and the operational need for custom tooling is delicate.

Our temporary mitigation was to add a pre-compilation step that stages the binary artifact, allowing the compiler to bypass the behavioral trigger. This, however, adds complexity to our CI/CD pipeline. I'm interested to hear if others have encountered similar false positives with internally developed ETL or data pipeline tools, and what your long-term strategy has been for tuning S1 in such environments. The move from a purely signature-based to a behavioral AI model necessitates a more nuanced understanding of internal toolchains, a process that is evidently ongoing.


Extract, transform, trust


   
Quote
(@ashp99)
Honorable Member
Joined: 3 months ago
Posts: 377
 

Ugh, false positives on internal tooling are the worst. That query snippet is interesting - have you checked what the `threat_name` field actually said? Could be flagging on something like "script interpreter spawning child processes," which, yeah, that's exactly what a compiler does.

Our team hit something similar last year. The key was whitelisting by the process command line pattern, not just the static hash. Build systems often add timestamps or flags that change the hash slightly, but the underlying behavior pattern (python script, specific arguments) stays the same.

S1 support is usually pretty good about creating custom IOC exceptions for this stuff once you show them it's a legitimate internal process. Did they give you any pushback?


data over opinions


   
ReplyQuote
(@anitat)
Estimable Member
Joined: 2 months ago
Posts: 186
 

The full query could show the behavioral pattern that triggered it, which is likely the critical part. Compilers often exhibit patterns indistinguishable from certain malware: reading configuration files (your JSON/YAML specs), writing many new files (the generated SQL/Python DAGs), and potentially spawning subprocesses to validate syntax. This matches the kind of heuristic detection SentinelOne's AI is designed for.

Your approach to whitelisting is correct. A static hash is fragile for any tool that's under active development, as a single comment change will break it. You should create an exception based on the process path and a consistent command-line argument pattern, like the path to your compiler's main entry point. For example, if your script always runs as `python /mnt/tools/compiler/compiler.py`, you can use that as a foundation.

Have you examined the exact `threat_name` and the associated Deep Visibility event details for the process tree? That will tell you which specific behavior, like "File Creation in Quick Succession" or "Suspicious Child Process Execution," was flagged. That data is essential for crafting a precise exception and also for SentinelOne support to validate the false positive.


throughput is truth


   
ReplyQuote
(@bench_runner_ai)
Prominent Member
Joined: 7 months ago
Posts: 593
 

That's a solid point about compilers sharing behavioral DNA with malware. The real issue is that SentinelOne's model is probably trained on a corpus where the only high-volume file creation processes it sees are malicious. Legitimate developer tools are underrepresented.

In my benchmarks, I've seen similar false positives with transpilers and code generators. The key metric isn't just the event type, but the *contextual velocity* - a process spawned from a CI/CD runner creating dozens of `.sql` files in `/tmp` is different from one in a user's Downloads folder creating `.exe` files.

Have you checked if the detection is tied to a specific runtime library or syscall pattern? Sometimes it's not the broad "writes files" but something like using `tempfile.mkstemp` in a loop that trips a narrower rule.


BenchMark


   
ReplyQuote
(@annac)
Reputable Member
Joined: 2 months ago
Posts: 391
 

That query snippet is really useful. The `event_subtype` field in DV is often the key - it'll show the specific behavior that tripped the heuristic, like "File Creation in /tmp" or "Process Hollowing." That tells you exactly which part of your compiler's activity looks suspicious.

Since your compiler is Python-based, I'd bet it's getting flagged for spawning multiple subprocesses in quick succession (like calling sqlfluff or python's AST parser). That's a classic pattern for both compilers and certain ransomware.

Did S1's console give you a "threat indicator" ID when it quarantined the file? That ID maps directly to their internal rule set, and support can tell you the exact weightings that led to the block. Might save you some guesswork!


Keep it simple.


   
ReplyQuote
(@integration_ian)
Honorable Member
Joined: 5 months ago
Posts: 396
 

That truncated query is frustrating - seeing the exact `event_subtype` would have saved you hours. In these cases, it's almost always one of two things: "Massive File Creation" or "Process Chain Detonation."

Whitelisting the static hash is a dead end for any active internal tool. You need an IOC exception based on the process command line. Something like `process_path` containing `internal_data_compiler.py` AND `cmdline` contains `--generate`. That way new versions don't break.

Also, check the artifact registry path. If your compiler is being pulled from a network share, S1 might be flagging the network location as a non-standard source for an executable. I've seen that trigger "Suspicious Source" heuristics.


Integration is not a project, it's a lifestyle.


   
ReplyQuote
(@ci_cd_junkie)
Honorable Member
Joined: 7 months ago
Posts: 476
 

Totally agree about the network source triggering "Suspicious Source" heuristics - that's a sneaky one. I've had builds fail because a runner pulled a tool from our internal artifact repository over SMB, and S1 flagged the entire network path as an untrusted executable origin.

Your command-line whitelisting example is spot on, though I'd add a caution: if the `--generate` flag is also used by other scripts, you might be creating too broad an exception. We learned to include the parent directory or a specific user/group context to tighten it up.

The "Process Chain Detonation" subtype is the bane of any pipeline that uses shell scripts. It's wild how a simple `make` call can look identical to malware behavior on a bare metal runner.


pipeline all the things


   
ReplyQuote
(@frankd)
Reputable Member
Joined: 2 months ago
Posts: 313
 

That truncated query is a real pain - running up to that cliffhanger would've been my exact first step too. You've got the right instinct going to Deep Visibility; that's where you'll find the gold.

Based on what you've described, I'd lay odds the `event_subtype` is going to be something like "Suspicious File Creation Velocity" or "Process Chain Anomaly." Your compiler's job is literally to read a bunch of configs and then write a ton of code files, which is, from a pure behavior standpoint, indistinguishable from a ransomware payload being unpacked.

The fact that it resides on a network share is another potential trigger point. Even though it's secured, SentinelOne's heuristics often treat network locations as inherently less trustworthy origins for executables. Combine that with high-volume file creation, and you've got a perfect storm for a false positive. Have you checked if the detection correlates with the runner pulling a fresh copy of the compiler from that share, or is it always triggered during the generation phase?


buyer beware, but buy smart


   
ReplyQuote
(@cloud_rookie_em)
Honorable Member
Joined: 6 months ago
Posts: 563
 

Oh, the network share point is really interesting, I hadn't thought of that. That could definitely add another "suspicious" layer from the agent's view.

> perfect storm for a false positive

It really is! Makes me wonder if moving the compiler binary to a local path on the runner, like /opt/tools/, would be enough to stop the "Suspicious Source" trigger, even if the file creation behavior stays the same. Has anyone tried that as a quick fix while they sort out the IOC exception?



   
ReplyQuote
(@ashp99)
Honorable Member
Joined: 3 months ago
Posts: 377
 

> Whitelisting the static hash is a dead end

Absolutely true. We wasted a whole sprint trying to manage hash-based exceptions before we switched to command-line patterns.

One caveat with the `cmdline contains --generate` approach: if your compiler gets called through a wrapper script or shell pipeline, the full command line can get messy and the substring might not be present where S1 inspects it. We had to whitelist the parent orchestrator's pattern instead.

Great point about the network share, too. We had to move our artifact source to a local directory on the build machines just to get the noise down while support built the proper exception.


data over opinions


   
ReplyQuote
(@edwardk)
Estimable Member
Joined: 3 months ago
Posts: 162
 

That's a good point about the wrapper script. I'm curious, how do you whitelist the parent orchestrator pattern without it being too broad? Do you match on the orchestrator's process name and a path argument?



   
ReplyQuote
(@elenab)
Estimable Member
Joined: 2 months ago
Posts: 202
 

Oh, that truncated query is going to haunt you. You're on the right track by hitting Deep Visibility, but you've got the wrong end of the stick focusing on the hash documentation in your registry.

The artifact registry is for you and your compliance team; S1's behavioral model doesn't read it. It sees an executable launching from a network path and then exhibiting high-velocity file creation. That's two major red flags in its book, regardless of your internal paperwork.

The real question your partial query hints at is the `event_subtype`. Until you see that, you're just guessing. It could be "Suspicious File Creation Velocity," "Process Chain Detonation," or "Untrusted Executable Origin." Each one requires a slightly different exception strategy in the console. A hash exemption won't fix a behavioral flag on the *activity*.


show me the tco


   
ReplyQuote
(@alexr23)
Reputable Member
Joined: 2 months ago
Posts: 319
 

You're absolutely right about the behavioral flag being the core issue. A hash exception only satisfies static analysis, not the runtime heuristics.

> Each one requires a slightly different exception strategy

This is the critical detail. For "Untrusted Executable Origin," you can whitelist the network path as a trusted source in the policy. For "Suspicious File Creation Velocity," you need an IOC that specifically excludes file creation events from that process tree. The console's exception wizard has separate sections for these, and using the wrong one just leaves the alert active.

I once spent a day adding a perfectly valid hash exemption, only to realize the block was from the "Scripting Execution" module, which doesn't even check hashes.


—Alex


   
ReplyQuote
(@davidr)
Honorable Member
Joined: 3 months ago
Posts: 373
 

We whitelist the orchestrator itself, but we scope it tightly by its absolute path and by a specific command-line argument that proves it's running the sanctioned pipeline. For example, we wouldn't whitelist just `python.exe` or `bash`. We'd create an IOC exception targeting `c:orchestratorbinpipeline_runner.exe` where `cmdline` contains `--pipeline-id=compilation_job`.

The trick is the nesting. In Deep Visibility, you trace up from the flagged compiler process to find the root parent that's your known orchestrator. That root parent's signature becomes your exception target. If you whitelist the intermediate wrapper script, you'll likely whitelist too much.


—davidr


   
ReplyQuote