How Cal.com Rebuilt AppSec After Going Closed Source
How Cal.com consolidated noisy security tooling into one continuous, context-aware pull request security program with Gecko.
Gecko Security

Everyone talks about combining SAST and DAST for complete security testing, but if you’re actually running both tools, you’ve noticed something frustrating. You catch SQL injection and XSS early with static scans, validate runtime configurations with live testing, and still ship authorization bugs that neither method detected. The problem isn’t your tooling choices or configuration settings. It’s that pattern matching can’t answer whether your code enforces the security properties it should, which is exactly what business logic vulnerabilities exploit.
TLDR:
SAST (Static Application Security Testing) analyzes your source code, bytecode, or binaries without executing the application. It works during development by scanning code files to identify vulnerabilities like SQL injection, cross-site scripting, and insecure configurations. Think of it as a white-box approach where the testing tool has complete visibility into how your code is structured.
DAST (Runtime Application Security Testing) tests your running application from the outside, simulating how an attacker would probe for vulnerabilities without access to source code. DAST tools send requests to your application and analyze responses to find security weaknesses in the deployed environment.
Together, these methods cover different security blind spots in your development lifecycle.
SAST tools scan your codebase by parsing it into an Abstract Syntax Tree (AST), which represents the code’s structure. From there, they perform data flow analysis to track how data moves through your application. Taint tracking follows untrusted input from entry points to potentially dangerous functions to identify vulnerabilities where unvalidated data could cause harm.
This analysis happens before you compile or deploy. SAST integrates directly into your IDE or CI/CD pipeline, flagging issues while you’re still writing code. That’s shift-left security: moving vulnerability detection earlier in the development cycle when fixes cost less and take less time.
DAST tools approach your application as an attacker would: with no source code access and no knowledge of internal architecture. They start by crawling your running application to map all endpoints, forms, and parameters they can interact with. This discovery phase builds an attack surface map of everything exposed to users.
Once mapped, DAST tools launch automated attacks against these entry points. They inject malicious payloads, manipulate session tokens, attempt authentication bypasses, and test authorization boundaries. The tool monitors how your application responds to determine if vulnerabilities exist.
This catches issues that only appear at runtime. Misconfigured authentication middleware won’t show up in static code scans. Neither will broken session management, incorrect CORS policies, or server misconfigurations.
The choice between SAST and DAST isn’t either-or, but understanding where each excels helps you deploy them effectively.
| Dimension | SAST | DAST |
|---|---|---|
| Testing Phase | Pre-compilation, during development | Post-deployment, on running application |
| Code Access | Requires source code or bytecode | Black-box, no code access needed |
| Vulnerability Types | SQL injection, XSS, hardcoded secrets, buffer overflows | Auth bypasses, session issues, server misconfigurations, runtime logic flaws |
| False Positive Rate | Higher due to lack of runtime context | Lower, tests actual exploitability |
| SDLC Integration | IDE and CI/CD pipeline | Staging or production environments |
| Speed | Fast, scans in minutes | Slower, depends on application size |
SAST catches vulnerabilities before they reach production but struggles with false positives because it can’t verify if a code path is actually reachable at runtime. DAST only finds exploitable issues but misses vulnerabilities in code paths it can’t reach through normal application interaction.
Resource requirements differ too. SAST needs access to your codebase and build environment. DAST needs a deployed instance to test against.
SAST’s biggest advantage is catching vulnerabilities before they ship. You get immediate feedback in your IDE or pull request, fixing issues when the code is fresh in your mind and the cost of remediation is minimal. SAST scans your entire codebase, including code paths that might not get exercised during testing, giving you coverage that DAST can’t match.
The developer experience is another strength. SAST tools point to exact line numbers and often suggest fixes, making remediation straightforward for syntactic vulnerabilities like SQL injection or XSS.
But SAST has real limitations. High false positive rates remain a persistent problem because the tool can’t verify whether a flagged code path is actually reachable or exploitable at runtime. Security teams waste hours triaging findings that turn out to be impossible to exploit in practice.
The bigger gap: SAST fails at business logic vulnerabilities. Pattern matching works for SQL injection because the vulnerability looks the same across codebases. But authorization flaws are unique to how your application should behave. SAST can’t answer whether your authorization logic is correct, only whether it matches a known bad pattern.
Broken access control remains the top OWASP vulnerability despite decades of SAST adoption.
DAST excels at finding vulnerabilities that only surface in deployed environments. Server misconfigurations, incorrect CORS policies, broken authentication middleware, and session management issues won’t show up in static code scans because they test actual runtime configuration, not theoretical code paths.
Language independence is another strength. DAST tests the exposed attack surface regardless of what’s underneath, making it useful for polyglot architectures where SAST would require multiple language-specific tools.
But DAST’s limitations are real. Detection happens late in your development cycle, after deployment to staging or production. Finding a critical vulnerability at this stage means rolling back releases or emergency patches.
Code coverage presents another problem. DAST can only test what it can reach through normal application interaction. Deep logic branches, error handling paths, and functionality behind complex workflows often go untested.
IAST (Interactive Application Security Testing) instruments your application with monitoring agents during testing. As you run functional tests or interact with the application, IAST observes code execution in real time, combining SAST’s code visibility with DAST’s runtime validation. This hybrid approach catches vulnerabilities with lower false positives because it sees both the code structure and actual execution paths.
RASP (Runtime Application Self-Protection) embeds security controls directly into your running application. Instead of just detecting vulnerabilities, RASP monitors application behavior in production and blocks attacks as they happen.
SCA (Software Composition Analysis) scans third-party dependencies against known CVE databases and license compliance requirements, catching risks in code you didn’t write but are responsible for securing.
Run SAST early and often. Integrate it into your IDE for real-time feedback as developers write code, then again in CI/CD pipelines to catch issues before merge. Trigger SAST scans on every pull request and block merges on critical findings.
DAST runs later, once you have a deployed environment to test. Schedule DAST scans in staging before production releases and set up recurring scans in production to catch configuration drift or newly introduced endpoints.
Sequence them: SAST first to filter obvious code-level issues, then DAST to validate what’s actually exploitable in deployed configurations.
Pattern matching breaks down when the vulnerability isn’t in the code you wrote, but in the code you didn’t write. OWASP 2025 testing found broken access control in 100% of applications scanned. That’s not a detection problem. That’s a mismatch between what these tools analyze and what the vulnerability actually is.
SAST and DAST excel at syntactic vulnerabilities where the problem looks the same across codebases. Business logic vulnerabilities break intent instead. A missing authorization check doesn’t have a signature because the correct behavior is unique to your application.
AI coding assistants ship code faster than security teams can audit it. Across 80 coding tasks spanning four languages and four vulnerability types, only 55% of AI-generated code was secure, meaning nearly half introduces known security flaws.
The root cause: AI models learn from public repositories filled with vulnerable code. When GitHub contains millions of examples of missing authorization checks or insecure direct object references, the model replicates those patterns.
SAST and DAST weren’t built for this velocity. Traditional scanning cycles assume human-written code reviewed before commit. AI can generate entire features in seconds, overwhelming review processes designed for slower development cycles.
Human developers write bugs. AI writes bugs at scale.
Neither SAST nor DAST covers your full attack surface alone. Integration requires workflow orchestration that treats findings from both tools as inputs to a unified triage process.
Configure deduplication rules to merge identical findings surfaced through different methods. When SAST flags a SQL injection point and DAST confirms it’s exploitable, that’s one vulnerability, not two separate tickets. Map findings to the same code locations or API endpoints to consolidate alerts.
Priority scoring should weight DAST findings higher since they’re verified as exploitable in your actual environment. SAST findings without DAST confirmation need additional validation before remediation. Automate the handoff by triggering targeted DAST scans when SAST identifies a potential vulnerability.
When choosing SAST tools, language support matters most. SonarQube offers broad coverage across Java, Python, JavaScript, and C#. GitHub Advanced Security bundles CodeQL for repository-integrated scanning. Semgrep provides customizable rules with strong CI/CD integration.
For DAST, OWASP ZAP handles open-source vulnerability scanning. Burp Suite fits manual testing workflows.
Selection criteria should include language and framework coverage matching your stack, CI/CD integration depth, false positive rates and tuning flexibility, remediation guidance quality, and scan speed relative to deployment frequency.
Pattern matching fails when vulnerabilities come from how components interact across your codebase. Semantic code analysis builds a Code Property Graph that maps relationships between functions, services, and data flows.
This changes the question from “Does this code match a bad pattern?” to “Does this code enforce the security properties it should?” Semantic analysis traces call chains across repositories, spots missing authorization checks in execution paths, and chains smaller issues into exploitable vulnerabilities.
Gecko uses semantic indexing to understand how your application should behave, then checks whether that intent is actually enforced. The system threat models attack scenarios specific to your codebase and validates each for exploitability.
DAST’s value proposition has always been that it tests what’s actually running. Send a request, observe the response, confirm the exploit. The problem is everything that has to exist before that loop starts: a deployed staging environment, a working crawler that can reach your authenticated endpoints, rules to suppress the noise, and a team to triage findings that are real but untestable at the point DAST surfaces them.
Gecko sidesteps that entirely. By ingesting your architecture diagrams, API contracts, design documents, and runtime behavior descriptions alongside the source code itself, Gecko builds a model of what your application is supposed to do, beyond what the code literally does. That context is what DAST approximates by poking a live system. Gecko reasons to the same answer from the other direction, statically, before a line ships.
DAST’s value proposition has always been that it tests what’s actually running. Send a request, observe the response, confirm the exploit. The problem is everything that has to exist before that loop starts: a deployed staging environment, a working crawler that can reach your authenticated endpoints, rules to suppress the noise, and a team to triage findings that are real but untestable at the point DAST surfaces them.
Gecko sidesteps that entirely. By ingesting your architecture diagrams, API contracts, design documents, and runtime behavior descriptions alongside the source code itself, Gecko builds a model of what your application is supposed to do, beyond what the code literally does. That context is what DAST approximates by poking a live system. Gecko reasons to the same answer from the other direction, statically, before a line ships.
The practical difference is coverage and timing. DAST can only test endpoints it can reach through normal interaction; authenticated deep-links, multi-step workflows, and error-handling branches frequently go untested. Gecko traces the full call graph across every service and repository, including paths no crawler would exercise, and flags missing authorization checks, privilege escalation chains, and broken object-level access before the code is merged. Same class of finding. Weeks earlier. No staging environment required.
This is where application security is heading. AI coding assistants already generate entire features in seconds; the review cycles DAST was designed for can’t keep up. The answer isn’t faster scanners: it’s scanners that understand intent. Contextual AI SAST, with access to architecture and design context, can reason about correctness the way a security engineer would, at the speed and scale that AI-generated code demands. DAST will still have a role in confirming deployed configurations, but the heavy lifting of business logic and authorization coverage is shifting left, to tools that understand what the code should do, beyond what it currently does.
You need both SAST and DAST for syntactic vulnerability coverage, but business logic flaws require a different approach. Pattern-based scanning can’t answer whether your authorization checks are correct for your specific application. Semantic analysis bridges that gap, and contextual AI SAST goes further. When a tool understands your architecture, runtime behavior, and design intent, it can catch the same classes of vulnerability DAST finds, plus the business logic issues neither SAST nor DAST reaches, all before deployment and without the setup overhead. That’s not an incremental improvement. It’s a different model for how security testing works.

Artemiy Malyshau
Co-founder & CTO
Artemiy served in an elite unit of the Austrian Cyber Forces, defending national infrastructure He was then the first employee at a government-backed cybersecurity research group, where he led security projects for Interpol and national governments. At Gecko he builds the platform trusted to sit inside Fortune 500 codebases, and holds it to the standard those governments taught him.
The latest news, technologies, and resources from our team.
How Cal.com consolidated noisy security tooling into one continuous, context-aware pull request security program with Gecko.
Gecko Security
Authorization bypass in n8n’s dynamic-credentials OAuth endpoints allows any authenticated user to operate on another user’s OAuth credential by supplying its ID, enabling unauthorized OAuth rebinding and revocation.
Artemiy Malyshau
An IDOR vulnerability in n8n’s public variables API allows authenticated users to read project variables outside their authorized scope, exposing secrets across project boundaries.
Artemiy Malyshau
Learn API scanning for automated security testing. Find vulnerabilities from broken authentication to business logic flaws in your endpoints.
Artemiy Malyshau
A complete guide to automated pentest tools and best practices. Learn what works, what doesn’t, and how to implement continuous security testing.
Artemiy Malyshau
Compare the best AI-powered application security testing tools. Find which tools detect business logic flaws and broken access control.
Artemiy Malyshau
Occasional updates, new content, and insights. No spam; unsubscribe anytime.