<p><strong>Meta Description:</strong> Aprenda a implementar testes de segurança eficazes: OWASP Top 10, penetration testing, SAST, DAST, SCA e análise de vulnerabilidades. Guia completo para proteção de aplicações.</p>

<hr>
<h2>Introdução à Segurança de Software</h2>

<p>A segurança de software é um aspecto crítico do desenvolvimento moderno. Com o aumento de ataques cibernéticos e regulamentações como LGPD e GDPR, garantir que suas aplicações sejam seguras não é mais opcional - é uma necessidade de negócios.</p>

<h3>Estatísticas Alarmantes</h3>

<figure class="wp-block-table"><table>
<tr><th>Dado</th><th>Porcentagem</th></tr>
<tr><td>Ataques direcionados a apps web</td><td>40{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de todos os ataques</td></tr>
<tr><td>Cust médio de violação de dados</td><td>R$ 6.4 milhões</td></tr>
<tr><td>Tempo médio para detectar breach</td><td>207 dias</td></tr>
<tr><td>apps com vulnerabilidades críticas</td><td>47{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>
<tr><td>OWASP Top 10 presente em</td><td>94{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} das apps</td></tr>
</table></figure>

<hr>
<h2>OWASP Top 10: As Maiores Vulnerabilidades</h2>

<p>O OWASP Top 10 é o guia definitivo das vulnerabilidades mais críticas em aplicações web. Vamos explorar cada uma.</p>

<h3>A01 - Broken Access Control (Controle de Acesso Quebrado)</h3>

<p><strong>Descrição:</strong> Usuários podem executar ações além de suas permissões permitidas.</p>

<p><strong>Exemplos:</strong><br><pre><code># VULNERÁVEL - IDOR (Insecure Direct Object Reference)<br>@app.route('/pedidos/')<br>def get_pedido(id):<br>    # Não verifica se o pedido pertence ao usuário logado<br>    return Pedido.query.get(id)</p>

<p># SEGURO<br>@app.route('/pedidos/')<br>@login_required<br>def get_pedido(id):<br>    pedido = Pedido.query.filter_by(<br>        id=id, <br>        usuario_id=current_user.id<br>    ).first_or_404()<br>    return pedido<br></code></pre></p>

<p><strong>Mitigação:</strong><br><ul><li>Implementar autorização em cada camada</li><ol><li>Negar por padrão</li><br><li>Usar IDs aleatórios (UUID)</li><br><li>Log de acessos</li><br></ol><br><h3>A02 - Cryptographic Failures (Falhas Criptográficas)</h3></p>

<p><strong>Descrição:</strong> Exposição de dados sensíveis devido a criptografia inadequada.</p>

<p><strong>Exemplos:</strong><br><pre><code># VULNERÁVEL<br>senha = "senha123"  # Sem hash<br>dados = dados.encode("utf-8")  # Sem criptografia</p>

<p># SEGURO<br>from cryptography.fernet import Fernet</p>

<p># Gerar chave (armazenar em segurança!)<br>key = Fernet.generate_key()<br>cipher = Fernet(key)</p>

<p>senha_hash = bcrypt.hashpw("senha123".encode(), bcrypt.gensalt())<br>dados_criptografados = cipher.encrypt(dados)<br></code></pre></p>

<p><strong>Mitigação:</strong><ol><li>Usar criptografia forte (AES-256, bcrypt, Argon2)</li><br><li>Gerenciar chaves com Key Vault</li><br><li>TLS para dados em trânsito</li><br><li>Nunca hardcodar secrets</li><br></ol><br><h3>A03 - Injection (Injeção)</h3></p>

<p><strong>Descrição:</strong> Injeção de código malicioso através de inputs não sanitizados.</p>

<p><strong>Exemplos:</strong></p>

<pre><code>-- SQL Injection Vulnerável
cursor.execute(f"SELECT * FROM users WHERE email = '{email}'")

<p>-- SQL Injection Seguro<br>cursor.execute("SELECT * FROM users WHERE email = {6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}s", (email,))<br></code></pre></p>

<pre><code># Command Injection Vulnerável
os.system(f"ping {host}")

<p># Command Injection Seguro<br>import subprocess<br>subprocess.run(["ping", host])  # Lista, não string!<br></code></pre></p>

<pre><code>// XSS Vulnerável
document.getElementById('comment').innerHTML = userInput;

<p>// XSS Seguro<br>document.getElementById('comment').textContent = userInput;<br>// ou<br>element.textContent = sanitizeHTML(userInput);<br></code></pre></p>

<p><strong>Mitigação:</strong><ol><li>Sanitizar e validar inputs</li><br><li>Usar ORM ou queries parametrizadas</li><br><li>Escapar outputs</li><br><li>Content Security Policy (CSP)</li><br></ol><br><h3>A04 - Insecure Design (Design Inseguro)</h3></p>

<p><strong>Descrição:</strong> Arquitetura e modelagem de sistema com falhas de segurança inerentes.</p>

<p><strong>Mitigação:</strong><ol><li>Threat modeling na fase de design</li><br><li>Segregar recursos por criticidade</li><br><li>Limitar tentativas de login (rate limiting)</li><br><li>Princípio de menor privilégio</li><br></ol><br><h3>A05 - Security Misconfiguration (Configuração de Segurança)</h3></p>

<p><strong>Exemplos:</strong><br><pre><code># Docker vulnerável<br>docker run -p 80:80 -v /:/root image:latest</p>

<p># Docker seguro<br>docker run <br>  --read-only <br>  --no-new-privileges <br>  -p 8080:8080 <br>  --cap-drop ALL <br>  image:latest<br></code></pre></p>

<pre><code># Flask vulnerável
app = Flask(__name__)
app.debug = True  # Reveals code in errors!

<p># Flask seguro<br>app = Flask(__name__)<br>app.config['DEBUG'] = False<br>app.config['PROPAGATE_EXCEPTIONS'] = False<br></code></pre></p>

<p><strong>Mitigação:</strong><ol><li>Hardening de servidores</li><br><li>Revisão de configurações</li><br><li>Automação de patching</li><br><li>Arquitetura minimalista</li><br></ol><br><h3>A06 - Vulnerable and Outdated Components (Componentes Vulneráveis)</h3></p>

<p><strong>Mitigação:</strong><br><pre><code># Verificar dependências vulneráveis<br>pip install safety<br>safety check</p>

<p># npm audit<br>npm audit</p>

<p># OWASP Dependency-Check<br>dependency-check --project App --scan ./lib<br></code></pre></p>

<pre><code># GitHub Actions - Verificar vulnerabilidades em PR<ol><li>name: Run Snyk Security Test</li>
</ol>  uses: snyk/actions/python@master
  with:
    args: --severity-threshold=high
  env:
    SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }}
</code></pre>

<h3>A07 - Identification and Authentication Failures</h3>

<pre><code># Vulnerável - Sem rate limiting
@app.route('/login', methods=['POST'])
def login():
    user = User.query.filter_by(email=email).first()
    if bcrypt.checkpw(password, user.password_hash):
        login_user(user)
        return redirect('/dashboard')

<p># Seguro - Com rate limiting<br>from flask_limiter import Limiter<br>limiter = Limiter(app)</p>

<p>@app.route('/login', methods=['POST'])<br>@limiter.limit("5 per minute")<br>def login():<br>    # ... resto do código<br></code></pre></p>

<p><strong>Mitigação:</strong><ol><li>MFA (Autenticação Multifator)</li><br><li>Rate limiting em autenticação</li><br><li>Senhas complexas (passphrase &gt; senha)</li><br><li>Sessões com timeout</li><br></ol><br><h3>A08 - Software and Data Integrity Failures</h3></p>

<pre><code># GitHub Actions - Verificar integridade de dependências<ol><li>name: Verify checksums</li>
</ol>  run: |
    echo "$CHECKSUM" &gt; expected_checksum.txt
    sha256sum -c expected_checksum.txt
  env:
    CHECKSUM: ${{ secrets.CHECKSUM }}
</code></pre>

<p><strong>Mitigação:</strong><ol><li>Verificar integridade de dependências</li><br><li>Assinar artefatos</li><br><li>CI/CD com aprovações</li><br><li>Não confiar em dados não verificados</li><br></ol><br><h3>A09 - Security Logging and Monitoring Failures</h3></p>

<pre><code>import logging
from flask import request

<p>logger = logging.getLogger(__name__)</p>

<p>@app.before_request<br>def log_request():<br>    logger.info({<br>        'ip': request.remote_addr,<br>        'method': request.method,<br>        'path': request.path,<br>        'user_agent': request.headers.get('User-Agent')<br>    })</p>

<p>@app.route('/login', methods=['POST'])<br>def login():<br>    if failed_login(user):<br>        logger.warning({<br>            'event': 'failed_login',<br>            'email': request.form.get('email'),<br>            'ip': request.remote_addr,<br>            'attempts': get_attempts(request.remote_addr)<br>        })<br>        # Alertar se muitas tentativas<br></code></pre></p>

<p><strong>Mitigação:</strong><ol><li>Logging de todos os eventos de segurança</li><br><li>Monitoramento 24/7</li><br><li>Alertas para anomalias</li><br><li>Retenção de logs adequada</li><br></ol><br><h3>A10 - Server-Side Request Forgery (SSRF)</h3></p>

<pre><code># Vulnerável
@app.route('/fetch_url')
def fetch_url():
    url = request.args.get('url')
    response = requests.get(url)  # Pode acessar internamente!
    return response.text

<p># Seguro<br>from urllib.parse import urlparse</p>

<p>ALLOWED_HOSTS = ['api.exemplo.com', 'cdn.exemplo.com']</p>

<p>@app.route('/fetch_url')<br>def fetch_url():<br>    url = request.args.get('url')<br>    parsed = urlparse(url)</p>

<p>if parsed.hostname not in ALLOWED_HOSTS:<br>        abort(403)</p>

<p># Block private IPs<br>    if parsed.hostname in ['localhost', '127.0.0.1', '0.0.0.0']:<br>        abort(403)</p>

<p>return requests.get(url).text<br></code></pre></p>

<hr>
<h2>Ferramentas de Teste de Segurança</h2>

<h3>SAST - Static Application Security Testing</h3>

<figure class="wp-block-table"><table>
<tr><th>Ferramenta</th><th>Linguagem</th><th>Tipo</th><th>Custo</th></tr>
<tr><td><strong>SonarQube</strong></td><td>Multi</td><td>Self-hosted</td><td>Grátis/Enterprise</td></tr>
<tr><td><strong>Snyk Code</strong></td><td>Multi</td><td>Cloud</td><td>Grátis/Pro</td></tr>
<tr><td><strong>Semgrep</strong></td><td>Multi</td><td>CLI</td><td>Grátis</td></tr>
<tr><td><strong>Checkmarx</strong></td><td>Multi</td><td>Enterprise</td><td>Comercial</td></tr>
<tr><td><strong>Fortify</strong></td><td>Multi</td><td>Enterprise</td><td>Comercial</td></tr>
</table></figure>

<h3>DAST - Dynamic Application Security Testing</h3>

<figure class="wp-block-table"><table>
<tr><th>Ferramenta</th><th>Tipo</th><th>Custo</th></tr>
<tr><td><strong>OWASP ZAP</strong></td><td>Open Source</td><td>Grátis</td></tr>
<tr><td><strong>Burp Suite</strong></td><td>Freemium</td><td>$399+/ano</td></tr>
<tr><td><strong>Acunetix</strong></td><td>Commercial</td><td>Sob consulta</td></tr>
<tr><td><strong>Netsparker</strong></td><td>Commercial</td><td>Sob consulta</td></tr>
</table></figure>

<h3>SCA - Software Composition Analysis</h3>

<figure class="wp-block-table"><table>
<tr><th>Ferramenta</th><th>Foco</th><th>Custo</th></tr>
<tr><td><strong>Snyk</strong></td><td>Dependencies</td><td>Grátis/Pro</td></tr>
<tr><td><strong>OWASP Dep-Check</strong></td><td>Dependencies</td><td>Grátis</td></tr>
<tr><td><strong>WhiteSource</strong></td><td>Enterprise</td><td>Comercial</td></tr>
<tr><td><strong>FOSSA</strong></td><td>License compliance</td><td>Grátis/Pro</td></tr>
</table></figure>

<h3>IAST - Interactive Application Security Testing</h3>

<figure class="wp-block-table"><table>
<tr><th>Ferramenta</th><th>Tipo</th></tr>
<tr><td><strong>Contrast Security</strong></td><td>Commercial</td></tr>
<tr><td><strong>Hdiv</strong></td><td>Commercial</td></tr>
<tr><td><strong>Seeker</strong> (Synopsys)</td><td>Commercial</td></tr>
</table></figure>

<hr>
<h2>Implementando Testes de Segurança no CI/CD</h2>

<h3>GitHub Actions - Pipeline de Segurança</h3>

<pre><code>name: Security Pipeline

<p>on: [push, pull_request]</p>

<p>jobs:<br>  sast:<br>    runs-on: ubuntu-latest<br>    steps:<br>      - uses: actions/checkout@v4</p>

<p>- name: Run Semgrep<br>        uses: returntocorp/semgrep-action@v1<br>        with:<br>          config: &gt;<br>            p/owasp-top-ten<br>            p/nodejs-scan</p>

<p>- name: SonarCloud Scan<br>        uses: SonarSource/sonarcloud-github-action@master<br>        env:<br>          SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}</p>

<p>sca:<br>    runs-on: ubuntu-latest<br>    steps:<br>      - uses: actions/checkout@v4</p>

<p>- name: Run Snyk<br>        uses: snyk/actions/python@master<br>        with:<br>          args: --severity-threshold=high</p>

<p>dast:<br>    runs-on: ubuntu-latest<br>    steps:<br>      - uses: actions/checkout@v4</p>

<p>- name: Start application<br>        run: docker-compose up -d</p>

<p>- name: OWASP ZAP Scan<br>        uses: zaproxy/action-baseline@v0.9.0<br>        with:<br>          target: 'https://localhost:8443'<br>          rules_rules_name: 'api-scan'<br></code></pre></p>

<hr>
<h2>Penetration Testing</h2>

<h3>Metodologia OWASP</h3>

<pre><code>1. Information Gathering
   - Footprinting
   - Enumeration
   <ol><li>Threat Modeling</li>
</ol>   - Identify assets
   - Analyze threats
   <ol><li>Vulnerability Analysis</li>
</ol>   - Automated scanning
   - Manual testing
   <ol><li>Exploitation</li>
</ol>   - Proof of concept
   - Impact assessment
   <ol><li>Reporting</li>
</ol>   - Findings
   - Recommendations
   - Remediation
</code></pre>

<h3>Tipos de Pentest</h3>

<figure class="wp-block-table"><table>
<tr><th>Tipo</th><th>Conhecimento</th><th>Escopo</th><th>Custo</th></tr>
<tr><td><strong>Black Box</strong></td><td>Zero</td><td>Sem informação</td><td>$$$</td></tr>
<tr><td><strong>Gray Box</strong></td><td>Parcial</td><td>Credenciais limitadas</td><td>$$$$</td></tr>
<tr><td><strong>White Box</strong></td><td>Total</td><td>Código e documentação</td><td>$$$$$</td></tr>
</table></figure>

<h3>Ferramentas de Pentest</h3>

<pre><code># Reconhecimento
nmap -sV -sC target.com
subfinder -d target.com
amass enum -passive -d target.com

<p># Scanning<br>nikto -h https://target.com<br>sqlmap -u "https://target.com/api?id=1"<br>XSStrike -u "https://target.com/search?q=test"</p>

<p># Exploitation<br>metasploit framework<br>burp suite professional<br></code></pre></p>

<hr>
<h2>Conclusão</h2>

<p>Segurança de software é responsabilidade de todos. Implementar testes de segurança de forma integrada ao ciclo de desenvolvimento é essencial para reduzir riscos e proteger dados sensíveis.</p>

<p><strong>Resumo:</strong><ol><li>OWASP Top 10 deve ser training obrigatório</li><br><li>SAST/DAST/SCA integrados ao CI/CD</li><br><li>Pentests periódicos são essenciais</li><br><li>Nunca confie em inputs de usuários</li><br><li>Criptografia forte é não negociável</li></ol></ul></p>

<hr>
<h3>FAQ</h3>

<p><strong>P: Com que frequência devo fazer pentests?</strong>  <br>R: Mínimo annually, idealmente a cada 6 meses ou após grandes mudanças.</p>

<p><strong>P: SAST substitui DAST?</strong>  <br>R: Não. SAST analisa código, DAST testa aplicação em execução. São complementares.</p>

<p><strong>P: Como começar com segurança em devs?</strong>  <br>R: Treinamento OWASP Top 10, implementar SAST no CI/CD, secure code review.</p>

<p><strong>P: Bug bounty substitui pentest?</strong>  <br>R: Não. São complementares. Bug bounty encontra issues em produção, pentest é controlado.</p>