EyalSec is a security guard that lives inside your Python and stops an attacker at the exact moment they try to break in, before any damage is done.
Log it. Your app runs exactly like before. Whenever something dangerous happens, EyalSec quietly writes it down on your dashboard, so you can see what an attacker tried and how.
Stop and log it. EyalSec steps in and blocks the attack, and still records it on your dashboard. The moment untrusted data reaches a dangerous action, your program stops, before anything bad can run.
EyalSec's taint engine surfaced two unauthenticated SQL-injection flaws in Django, the world's most-deployed Python web framework, both officially assigned CVEs and confirmed exploitable. We reported them responsibly, so the whole ecosystem is safer for it.
SQL injection via crafted JSON object keys used as column aliases in QuerySet.values() / values_list() on models with a JSONField.
SQL injection via FilteredRelation column aliases in annotate() / alias() with **kwargs expansion.
Network sockets, files, stdin, data is marked untrusted the moment it enters.
The taint follows the value as it's copied and transformed through your program.
exec, eval, compile, os.system, subprocess, pickle, sqlite3, ctypes, …
Your existing python stays put. Run es-python when you want the safety net.
Python code examples of scenarios other tools can't find, and EyalSec can.
Why RASP misses: RASP flags a call only when its argument still matches a payload it logged from the request. The app splits, slices, and rejoins that input first, so the bytes reaching os.system match nothing RASP saw. es-python taints the data itself, so the mark rides through every transform to the sink.
Why WAF / edge misses: the record arrives as a file from a batch drop, never over HTTP, so the edge has no packet to inspect. es-python taints every input channel, files included, so the bytes stay marked all the way to the SQL sink.
Why SAST misses: which callable ACTIONS[name] resolves to is a runtime value; a static engine can't prove the tainted arg reaches os.system. es-python sees the actual call.
Why DAST / fuzzing misses: the query runs cleanly and returns rows, zero crash signal for a coverage fuzzer, which records a "pass". es-python flags the injection semantically, no crash required.
Why SCA / dependency misses: SCA matches your lockfile against a CVE database. A deserialization bug you wrote yourself is in no advisory feed, so it stays silent. es-python catches the live tainted-bytes -> pickle.loads flow.
Why Sandboxing / isolation misses: seccomp/gVisor decide per syscall, to allow pg_dump they must permit execve, which lets the injected tar; … through too. es-python gates only the tainted exec and leaves the clean one alone.
Why EDR / runtime threat misses: EDR detects malicious behavior after the fact, a spawned shell, a beacon. es-python raises before the pickle gadget runs, so there's no behavior left for the EDR to observe.