ИИ пишет код быстро. AigisSAST проверяет, что он не оставил дыр.
Security scanner for AI-generated code: finds what vibe coding leaves behind and explains how to fix it.
Зачем
Cursor, Copilot и ChatGPT собирают рабочий бэкенд за вечер. Но по пути они почти всегда оставляют одно и то же:
токен бота прямо в коде, f"SELECT ... {user}", allow_origins=["*"], debug=True, открытый наружу Postgres.
Код работает, тесты зелёные, а сервис уже можно взломать.
AigisSAST ловит именно эти ошибки и объясняет каждую простым языком: чем она опасна и как исправить, с готовым кодом.
Без регистрации и облака, ничего не отправляет наружу (если сам не включишь --ai).
- Ноль зависимостей. Только стандартная библиотека Python, ставится за секунду.
- AST, а не grep. Python-код разбирается синтаксическим деревом, поэтому меньше ложных срабатываний.
- Секреты маскируются в отчёте:
sk-p************, сам ключ в логах CI не светится. - Не только ругается, но и чинит.
aigis fixсам выносит ключи в.envи правит безопасные случаи. - Видит прошлое.
aigis historyнаходит ключи, которые «удалили», но они остались в истории git. - CI-ready. Exit-коды, SARIF для GitHub Code Scanning, JSON, Markdown, GitHub Action и pre-commit hook.
Быстрый старт
pip install git+https://github.com/jasperBLCK/AigisSAST
aigis scan . # найти проблемы
aigis fix --dry-run # посмотреть, что исправится автоматически
aigis fix # исправить
aigis history # проверить всю историю git на утёкшие ключи
Попробуй на заведомо дырявом примере:
git clone https://github.com/jasperBLCK/AigisSAST && cd AigisSAST
pip install . && aigis scan examples
Что ловит
| ID | Уровень | Проблема | Где |
|---|---|---|---|
AIG001 |
CRITICAL | Токены и API-ключи: OpenAI, Anthropic, Telegram, GitHub, AWS, Stripe, Slack, Google, Yandex Cloud | везде |
AIG004 |
CRITICAL | Приватные ключи (RSA / EC / OpenSSH / PGP) | везде |
AIG002 |
HIGH | Захардкоженные пароли и секреты | Python, JS/TS, YAML, Dockerfile, compose, .ini/.toml |
AIG003 |
HIGH | Строка подключения к БД с паролем | везде, кроме документации |
AIG005 |
HIGH | .env попадает в репозиторий |
git / .gitignore |
AIG010 |
HIGH | SQL-инъекция: f-string, %, +, .format() в execute() / text() |
Python |
AIG011 |
HIGH | Shell-инъекция: shell=True, os.system с переменной |
Python |
AIG012 |
HIGH | eval / exec над динамическими данными |
Python |
AIG013 |
HIGH | pickle.loads, yaml.load без SafeLoader |
Python |
AIG017 |
HIGH | JWT без проверки подписи, algorithms=["none"] |
Python |
AIG030 |
HIGH | eval / new Function |
JS / TS |
AIG014 |
MEDIUM | debug=True, DEBUG = True |
Python |
AIG015 |
MEDIUM → HIGH | CORS * (HIGH вместе с allow_credentials=True) |
FastAPI, Express |
AIG016 |
MEDIUM | verify=False в requests / httpx |
Python |
AIG019 |
MEDIUM | Токены и OTP-коды через random вместо secrets |
Python |
AIG031 |
MEDIUM | XSS: innerHTML, dangerouslySetInnerHTML, v-html |
JS / TS / Vue |
AIG032 |
MEDIUM | Секреты в NEXT_PUBLIC_* / VITE_* / REACT_APP_* |
фронтенд |
AIG042 |
MEDIUM | Порт БД/Redis опубликован на 0.0.0.0 |
docker-compose |
AIG018 |
LOW | MD5 / SHA-1 | Python |
AIG021 |
LOW | POST/PUT/PATCH/DELETE без Depends(...) авторизации |
FastAPI |
AIG040 |
LOW | Контейнер работает от root | Dockerfile |
Подробно про любое правило: aigis explain AIG010, полный список: aigis rules.
Использование
aigis scan . # текстовый отчёт с объяснениями
aigis scan src api --quiet # несколько путей, без блоков «чем опасно / как исправить»
aigis scan . --min-severity medium # скрыть LOW
aigis scan . --fail-on critical # падать только на критичных
aigis scan . -f sarif -o aigis.sarif # для GitHub Code Scanning
aigis scan . -f json | jq '.findings[]' # для своих скриптов
aigis scan . -f markdown > SECURITY.md # отчёт для PR / заказчика
| Exit code | Значение |
|---|---|
0 |
нет находок уровня --fail-on (по умолчанию high) и выше |
1 |
найдены проблемы уровня --fail-on и выше |
2 |
ошибка запуска (неверный путь, неизвестное правило) |
В конце отчёта выводится security score (0–100) и оценка от A до F.
Исключения
eval(trusted_expr) # aigis: ignore
DEBUG = True # aigis: ignore[AIG014]
Файлы и папки исключаются через .aigisignore (glob-шаблоны) или флаг --exclude.
node_modules, .venv, dist и lock-файлы пропускаются автоматически, а в git-репозитории ещё и всё из .gitignore.
Автоисправление: aigis fix
aigis fix --dry-run # только показать diff
aigis fix # применить
Исправляет только то, что можно поменять без риска сломать логику:
| Было | Стало |
|---|---|
BOT_TOKEN = "7312845567:AA..." |
BOT_TOKEN = os.environ["BOT_TOKEN"] + значение в .env, ключ в .env.example |
connect(password="Pa55word!") |
connect(password=os.environ["PASSWORD"]) |
.env не в .gitignore |
.env добавлен в .gitignore |
requests.get(url, verify=False) |
verify=True |
yaml.load(data) |
yaml.safe_load(data) |
otp = random.randint(100000, 999999) |
otp = secrets.randbelow(900000) + 100000 |
token = random.choice(alphabet) |
secrets.choice(alphabet) |
app.run(debug=True) / DEBUG = True |
debug=False / DEBUG = os.getenv("DEBUG") == "1" |
- "5432:5432" в compose |
- "127.0.0.1:5432:5432" |
Нужные import os / import secrets добавляются сами. SQL-инъекции, eval, pickle, JWT и CORS
автоматически не трогаются: там нужно понимать логику приложения, поэтому они остаются в списке «вручную».
Утёкшие ключи в истории: aigis history
$ aigis history
aigis history: секретов в истории git: 1
[CRITICAL] AIG001 7312************ (Telegram bot token)
bot.py · коммит 402c92b от 2026-09-14 · удалён, но остался в истории
Удалить ключ новым коммитом мало: старая версия файла остаётся в истории, и её видит любой, кто склонировал репо.
aigis history проходит по всем коммитам и веткам, показывает, где и когда ключ появился и есть ли он в коде сейчас.
Ключи в отчёте замаскированы. Для CI: aigis history -f json, exit code 1, если что-то найдено.
Бейдж для README
aigis badge # пишет aigis-badge.svg с оценкой, например «aigis | A 100/100»
aigis badge --url # ссылка shields.io, без файла
AI-режим
export AIGIS_API_KEY=... # любой OpenAI-совместимый API
export AIGIS_BASE_URL=https://api.openai.com/v1 # или свой прокси / локальная LLM
export AIGIS_MODEL=gpt-4o-mini
aigis scan . --ai
Для каждой находки модель получает фрагмент кода вокруг неё и возвращает исправление именно под твой код.
Находки с секретами (AIG001–AIG005) в модель никогда не отправляются. Если ключа нет или API недоступен,
сканер предупредит об этом и покажет стандартные советы.
GitHub Actions
name: security
on: [push, pull_request]
jobs:
aigis:
runs-on: ubuntu-latest
permissions:
contents: read
security-events: write
steps:
- uses: actions/checkout@v4
- uses: jasperBLCK/AigisSAST@v0.2.0
with:
fail-on: high
Находки появятся во вкладке Security → Code scanning и прямо в diff пулл-реквеста.
pre-commit
repos:
- repo: https://github.com/jasperBLCK/AigisSAST
rev: v0.2.0
hooks:
- id: aigis
Как устроено
aigis scan
│
├── scanner git ls-files → фильтры → .aigisignore → чтение файлов
├── checks/
│ ├── python_ast ast.NodeVisitor: SQL, shell, eval, pickle, JWT, CORS, debug, random, FastAPI auth
│ └── text regex: токены, ключи, DSN, конфиги, Dockerfile, compose, JS/TS
├── ai (опционально) OpenAI-совместимый API, секреты отфильтрованы
└── report text · json · sarif · markdown + score / grade
aigis fix AST-позиции находок → точечные правки → .env / .env.example / .gitignore
aigis history git log -p --all → добавленные строки → те же детекторы секретов
aigis badge score / grade → SVG или shields.io
Разработка:
python -m venv .venv && . .venv/bin/activate
pip install -e ".[dev]"
ruff check . && ruff format --check . && pytest -q
Roadmap
- Python AST-правила, секреты, конфиги, Dockerfile, compose, JS/TS
- SARIF, JSON, Markdown, GitHub Action, pre-commit
- AI-исправления через OpenAI-совместимый API
-
aigis fix: автоматическое исправление безопасных случаев (вынос секретов в.env) -
aigis history: поиск секретов во всей истории git -
aigis badge: бейдж с оценкой безопасности - Проверка зависимостей на известные CVE и тайпсквоттинг
- Правила для Django и Flask, Go и PHP
- VS Code extension
License
Metadata
Release files for aigis-sast 0.2.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| aigis_sast-0.2.0.tar.gz | 40.4 kB | With provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| aigis_sast-0.2.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 77.2 kB
Release files / aigis_sast-0.2.0.tar.gz
| Download URL | aigis_sast-0.2.0.tar.gz |
|---|---|
| Size | 40.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
51437495fd0ff5136696e6eac2b41d749a1b90b69e38e37a72677ab51e7a1e3a
|
|
BLAKE2b-256 checksum How to use checksums |
83ee1ffe4b196f23661fabb3a53d4c595029e3115b89a895d376b9de01bcdaf1
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 3, 2026.
Transparency logRelease files / aigis_sast-0.2.0-py3-none-any.whl
| Download URL | aigis_sast-0.2.0-py3-none-any.whl |
|---|---|
| Size | 36.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
d00ac881b39e16179ac9f2ce3e6643b61312ee5d9ebf2620659087d05c01a98b
|
|
BLAKE2b-256 checksum How to use checksums |
9a2784ec81fc79c2e216b2714c382c41bb65003de61c875d92759053d79b6391
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 3, 2026.
Transparency logSecurity for aigis-sast 0.2.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for aigis_sast-0.2.0.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 3, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.