Zen by Aikido is an embedded security engine for autonomously protecting applications against common web attacks, like shell injection and SQL injection. We do so by hooking into sinks, validating them together with the incoming user input and in case the request is malicious, we block the request. It's similar to a traditional WAF, but with the full context of the called code and the user's input.
By participating in this program, you agree to:
- Respect the Community Code of Conduct
- Respect the Intigriti Terms and Conditions
- Respect the scope of the program
- Not discuss or disclose vulnerability information without prior written consent (including PoC's on YouTube and Vimeo)
Validation times
We will validate all submissions within the below timelines, once your submission has been verified by Intigriti.
Submissions validated outside of this may be awarded a €25 bonus.
| Vulnerability Severity | Time to validate |
|---|---|
| Exceptional | 2 Working days |
| Critical | 2 Working days |
| High | 5 Working days |
| Medium | 15 Working days |
| Low | 15 Working days |
This remains at the discretion of Aikido Security BV to award.
Check our fix
We offer up to €50 bonus to verify a resolved issue for us (when requested).
This remains at the discretion of Aikido Security BV to award.
Introduction
Zen is used by customers to protection against common web application attacks, such as path traversal, SQL injection and shell injection. It's different than a traditional WAF, since it lives inside your app and thus has full context of the called code and the user's input. This allows us to dramatically lower the amount of false positives, as our detection only kicks in when a relevant sink is called.
Zen is open-source and currently only available for Node.js. The source is available at: https://github.com/AikidoSec/firewall-node.
The current version of Zen is compatible with any Express-powered apps. Any bypass in other apps (lambda, NextJs, Hono, Google functions,..) are currently out-of-scope.
Focus
We are interested in submissions related to:
- Vulnerability in the firewall component itself
Beyond bypasses, there's also the risk of introducing security vulnerabilities in the user's app via our own firewall library. We encourage any research into this area as well, and have also assigned a separate tier for this (Tier 1).
- Bypasses in the detection of vulnerabilities
Zen hooks into several sinks, and when a sink is called, our detection kicks in. Together with the user input, we evaluate whether the user is exploiting a vulnerability.
Some examples of bypasses would be a missing sink, or a fundamental flaw in the way we perform the detection (e.g. universal bypass in the SQL injection module). Issues within this category will be awarded according to Tier 2.
- False positives while user input is safely passed to sink
Any false positives you encounter with our vulnerability detection, such as flagging a shell injection while it is safely encapsulated in the sink. Issues will be awarded in Tier 3. See Severity Assessment for more details.
Feedback
Would you like to help us improve our program or have some feedback to share, please send your anonymous feedback here:
Program feedback link
Please note this form will be checked periodically and should not be used for submission or support queries.
General
- Bypasses related to any rate limiting functionality are out of scope for the time being.
- Bypasses on prototype pollution freezing
- Bypasses of our detection algorithm, which is also applicable to other languages without language-specific constraints, may be treated as one report.
- This shouldn't happen often, and if the same bypass is attacked differently on another target (for example, on Python you need to pass an array, on Node you need to pass a string), we may still treat it as a separate report.
- Shell injection bypasses are currently out-of-scope as we are working on a new approach for detecting these type of vulnerabilities.
- SQL injection bypasses which leverage a tokenizer crash are temporarily out of scope as we explore a potential long-term remediation.
Zen for Node.js - Out of Scope
- Any bypasses when Zen for Node.js is used in a Windows environment. Windows is not officially supported yet.
Application
- Wordpress usernames disclosure
- Pre-Auth Account takeover/OAuth squatting
- Self-XSS that can't be used to exploit other users
- Verbose messages/files/directory listings without disclosing any sensitive information
- CORS misconfiguration on non-sensitive endpoints
- Missing cookie flags
- Missing security headers
- Cross-site Request Forgery with no or low impact
- Presence of autocomplete attribute on web forms
- Reverse tabnabbing
- Bypassing rate-limits or the non-existence of rate-limits.
- Best practices violations (password complexity, expiration, re-use, etc.)
- Clickjacking without proven impact/unrealistic user interaction
- CSV Injection
- Sessions not being invalidated (logout, enabling 2FA, etc.)
- Tokens leaked to third parties
- Anything related to email spoofing, SPF, DMARC or DKIM
- Content injection without being able to modify the HTML
- Username/email enumeration
- Email bombing
- HTTP Request smuggling without any proven impact
- Homograph attacks
- XMLRPC enabled
- Banner grabbing/Version disclosure
- Not stripping metadata of files
- Same-site scripting
- Subdomain takeover without taking over the subdomain
- Arbitrary file upload without proof of the existence of the uploaded file
- Blind SSRF without proven business impact (pingbacks aren't sufficient)
- Disclosed/misconfigured Google Maps API keys
- Host header injection without proven business impact
General
- In case that a reported vulnerability was already known to the company from their own tests, it will be flagged as a duplicate
- Theoretical security issues with no realistic exploit scenario(s) or attack surfaces, or issues that would require complex end user interactions to be exploited
- Spam, social engineering and physical intrusion
- DoS/DDoS attacks or brute force attacks
- Vulnerabilities that only work on software that no longer receive security updates
- Attacks requiring physical access to a victim's computer/device, man in the middle or compromised user accounts
- Recently discovered zero-day vulnerabilities found in in-scope assets within 14 days after the public release of a patch or mitigation may be reported, but are usually not eligible for a bounty
- Reports that state that software is out of date/vulnerable without a proof-of-concept
Tier 1 (vulnerabilities in firewall)
We follow Intigriti's triage standards.
Tier 2 (bypasses of vulnerability detection)
Aikido's Node.js agent general severity assessment table
For bypasses of vulnerability detection, severity is determined on a case-by-case basis. The following table provides a general overview on what to expect for each bypass:
| Bypass | Severity |
|---|---|
| Missing sink | Low - Low |
| Missing source | Low - Low |
| NoSQL injection bypass | Medium - Exceptional |
| Path traversal bypass | Medium - High |
| Shell Injection bypass | None - None |
| SQL injection bypass (PostgreSQL, MySQL, SQLite) | Low - Exceptional |
| SQL injection bypass (other dialects) | Low - Medium |
| Server Side Request Forgery | Low - High |
| Code Injection bypass | Low - High |
Aikido's Python & PHP, and other agents general severity assessment table
| Bypass | Severity |
|---|---|
| Missing sink | None - None |
| Missing source | Low - Low |
| NoSQL injection bypass | Medium - Exceptional |
| Path traversal bypass | Medium - High |
| Shell Injection bypass | None - None |
| SQL injection bypass (PostgreSQL, MySQL, SQLite) | Low - Exceptional |
| SQL injection bypass (other dialects) | Low - Medium |
| Server Side Request Forgery | Low - Medium |
Some crucial factors which determine the severity are:
- in case of a missing sink or source, how popular/common a sink/source is (which could usually be determined based on a GitHub code search)
- whether the bypass is only possible in limited cases (for example, a bypass which is only possible in an
UPDATESQL query) - the impact of the bypass (for example, path traversal bypasses have a lower reward than a SQL injection bypass)
Bypasses which only work on Windows or macOS environments may be lower in severity, since web services are not commonly deployed on those.
Tier 3 (false positives of vulnerability detection)
We're also interested in cases where we falsely block requests from the user, while the user input is safely encapsulated. We've made the bounties simple on purpose for those cases, so you are aware what to expect.
Issues in this Tier will be awarded on a case-by-case basis and depends mostly on:
- how common the false positive may be (for instance, if you catch a false positive with a commonly used SQL query operator like
SELECT, the award will be on the higher end, since such queries may be executed on almost every page you visit as an user). - if it has environmental constraints (e.g. only possible with a certain DBMS).
Difference between the tiers
All tiers have the same scope. There is a difference in bounties based on the following:
- Tier 1: actual vulnerabilities in the firewall
- Tier 2: bypasses of our detection (this doesn't directly expose a security risk, but improves our security product)
- Tier 3: false positives of our detection (this doesn't directly expose a security risk as well, but improves our security product)
How do I install firewall-node?
See https://github.com/AikidoSec/firewall-node/tree/main?tab=readme-ov-file#installation, and follow the instructions for Express.js based apps.
Ensure you set the environment variable AIKIDO_BLOCKING to true when launching your app. This ensures that you get immediate feedback during testing if your attack is blocked.
We recommend you to install firewall-node with any of the Express.js sample apps or with a DVWA like NodeGoat.
How do I install firewall-python?
You can install firewall-python directly from PyPi. Ensure you set the environment variable AIKIDO_BLOCKING to true when launching your app. Setting AIKIDO_DEBUG to true may be useful as well.
You can use one of the sample apps as starting point: https://github.com/AikidoSec/firewall-python/tree/main/sample-apps. The Dockerfile contains instructions to build aikido_firewall, so you don't have to do it yourself.
How do I install firewall-php?
Clone https://github.com/AikidoSec/firewall-php.
Browse to the /sample-apps/sqlite-php-server folder.
In this folder, docker compose up -d.
Visit the sample app at http://localhost:1337. Code of the sample app: https://github.com/AikidoSec/firewall-php/blob/main/sample-apps/sqlite-php-server/index.php.
How do I install firewall-ruby?
Clone https://github.com/AikidoSec/firewall-ruby, and navigate to the sample-apps directory.
Run docker-compose up -d to set-up the Docker containers for the database.
Afterwards, navigate to any of the rails7.1-x folder under the sample-apps directory and follow the instructions of the README.md (e.g. https://github.com/AikidoSec/firewall-ruby/tree/main/sample_apps/rails7.1_template), to launch your application.
Do I need to create an Aikido account to test the firewall?
No, you don't. Zen can be used without an Aikido account. An account is only needed when you want to report issues to your Aikido dashboard, but any reporting functionality is not in scope for the time being.
Do you offer a live Damn Vulnerable Web Application (DVWA) to test for bypasses?
We are considering it for future iterations, but for now, we recommend you to install Firewall with a project like OWASP NodeGoat. This would also allow you to use the debugger, which could help with understanding and testing the detection logic.
Beyond NodeGoat, you could also use some of our sample apps: https://github.com/AikidoSec/firewall-node/tree/main/sample-apps (Node.js) or https://github.com/AikidoSec/firewall-python/tree/main/sample-apps (Python). As an alternative, you can also write some vulnerabilities yourself.
For obvious reasons we can only allow submissions or applications for our program with a valid Intigriti account.
It will only take 2 minutes to create a new one or even less to log in with an existing account, so don't hesitate and let's get started. We would be thrilled to have you as part of our community.


























