O que é o Top 10 de segurança de API da OWASP?

Uma classificação de riscos de segurança específicos de API publicada pela OWASP (Open Worldwide Application Security Project). A edição de 2023 fornece a lista mais recente que reflete as ameaças que aumentaram com a adoção generalizada de APIs.

1️⃣ API1:2023 - Autorização de nível de objeto quebrada (BOLA)

Critical

Visão geral

Uma vulnerabilidade que permite o acesso não autorizado aos dados de outros usuários por meio da manipulação de IDs de objetos. É conhecida como a vulnerabilidade que ocorre com mais frequência e é mais fácil de ser explorada.

Risco

Os invasores podem acessar informações pessoais de outros usuários, detalhes de pagamento, histórico de pedidos e muito mais simplesmente alterando o ID no URL ou nos parâmetros de solicitação.

Exemplo de código vulnerável

JavaScript (Express) ❌ Bad
// Recebe ID e retorna dados diretamente - sem verificação de autorização
app.get('/api/users/:id/orders', async (req, res) => {
  const orders = await Order.find({ userId: req.params.id });
  res.json(orders);
});

Exemplo de código seguro

JavaScript (Express) ✅ Good
// Verificar com base no ID do usuário autenticado para verificação de autorização
app.get('/api/users/:id/orders', authenticate, async (req, res) => {
  if (req.user.id !== req.params.id && !req.user.isAdmin) {
    return res.status(403).json({ error: 'Forbidden' });
  }
  const orders = await Order.find({ userId: req.params.id });
  res.json(orders);
});

Lista de verificação de mitigação

2️⃣ API2:2023 - Autenticação quebrada

Critical

Visão geral

Uma vulnerabilidade que permite que os invasores assumam o controle de contas de usuário legítimas devido a implementações falhas do mecanismo de autenticação.

Problemas comuns

Políticas de senha fracas, gerenciamento inadequado de tokens, falta de proteção contra força bruta, gerenciamento inadequado de sessões e muito mais.

JavaScript Exemplo de mitigação: Verificação de JWT
const jwt = require('jsonwebtoken');

function authenticate(req, res, next) {
  const token = req.headers.authorization?.split(' ')[1];
  if (!token) return res.status(401).json({ error: 'Token required' });

  try {
    // Especificar explicitamente o algoritmo (evita o ataque alg: none)
    const decoded = jwt.verify(token, process.env.JWT_SECRET, {
      algorithms: ['HS256'],
      issuer: 'your-app',
    });
    req.user = decoded;
    next();
  } catch (err) {
    res.status(401).json({ error: 'Invalid token' });
  }
}

3️⃣ API3:2023 - Autorização de nível de propriedade de objeto quebrada

High

Visão geral

Uma vulnerabilidade em que o controle de acesso às propriedades (campos) dos objetos incluídos nas respostas da API é insuficiente. Este item combina Exposição excessiva de dados e Atribuição em massa.

JavaScript ✅ Filtragem de resposta
// Retornar apenas os campos públicos do objeto do usuário
function sanitizeUser(user, requesterId) {
  const publicFields = { id: user.id, name: user.name, avatar: user.avatar };

  // Somente o proprietário pode ver os campos adicionais
  if (requesterId === user.id) {
    publicFields.email = user.email;
    publicFields.phone = user.phone;
  }

  return publicFields;
  // ❌ return user; vazaria password_hash etc.
}

4️⃣ API4:2023 - Consumo irrestrito de recursos

High

Visão geral

Uma vulnerabilidade em que não há limites para o tamanho, a frequência ou o consumo de recursos das solicitações de API, o que leva a ataques de DoS ou picos de custo.

JavaScript (Express) Implementação de limites de recursos
const rateLimit = require('express-rate-limit');

// Limitação de taxa global
app.use(rateLimit({
  windowMs: 15 * 60 * 1000, // 15 minutos
  max: 100,                   // Máximo de 100 solicitações
  standardHeaders: true,
}));

// Limite de tamanho da carga útil
app.use(express.json({ limit: '10kb' }));

// Limite superior de paginação
app.get('/api/items', (req, res) => {
  const limit = Math.min(parseInt(req.query.limit) || 20, 100);
  // ...
});

5️⃣ API5:2023 - Autorização de nível de função quebrada

High

Visão geral

Uma vulnerabilidade em que o controle de acesso adequado não é implementado para funções administrativas e endpoints, permitindo que usuários comuns realizem operações administrativas.

JavaScript Controle de acesso baseado em função
function authorize(...roles) {
  return (req, res, next) => {
    if (!roles.includes(req.user.role)) {
      return res.status(403).json({ error: 'Insufficient permissions' });
    }
    next();
  };
}

// Acesso somente para administradores
app.delete('/api/admin/users/:id', authenticate, authorize('admin'), deleteUser);

// Administrador e moderador
app.put('/api/posts/:id/moderate', authenticate, authorize('admin', 'moderator'), moderatePost);

6️⃣ API6:2023 - Acesso irrestrito a fluxos de negócios confidenciais

Medium

Visão geral

Uma vulnerabilidade em que os fluxos críticos da lógica comercial não estão protegidos contra ataques automatizados. Exemplos: escalonamento de ingressos, coleta de cupons em massa, postagem de spam, etc.

Mitigações

7️⃣ API7:2023 - Falsificação de solicitação do lado do servidor (SSRF)

High

Visão geral

Uma vulnerabilidade em que o servidor busca uma URL fornecida pelo usuário sem validação, permitindo o acesso não autorizado a redes internas.

JavaScript Mitigação de SSRF
const { URL } = require('url');

function isAllowedUrl(input) {
  try {
    const url = new URL(input);
    // Restringir protocolos
    if (!['https:', 'http:'].includes(url.protocol)) return false;
    // Bloquear intervalos de IP privados
    const blocked = ['127.0.0.1', 'localhost', '0.0.0.0', '169.254.169.254'];
    if (blocked.includes(url.hostname)) return false;
    // Verifique os intervalos de rede interna (10.x, 172.16-31.x, 192.168.x)
    if (/^(10\.|172\.(1[6-9]|2\d|3[01])\.|192\.168\.)/.test(url.hostname)) return false;
    return true;
  } catch {
    return false;
  }
}

8️⃣ API8:2023 - Configuração incorreta de segurança

Medium

Visão geral

Configurações de segurança inadequadas em servidores ou estruturas de API. Inclui a permissão de métodos HTTP desnecessários, políticas CORS excessivamente permissivas, exposição de informações de depuração e muito mais.

JavaScript (Express) Configuração do cabeçalho de segurança
const helmet = require('helmet');
const cors = require('cors');

app.use(helmet());
app.use(cors({
  origin: ['https://app.example.com'], // Não use curingas
  methods: ['GET', 'POST', 'PUT', 'DELETE'],
  credentials: true,
}));

// Manipulador de erros: não retorne traços de pilha na produção
app.use((err, req, res, next) => {
  res.status(500).json({
    error: process.env.NODE_ENV === 'production'
      ? 'Internal Server Error'
      : err.message,
  });
});

9️⃣ API9:2023 - Gerenciamento inadequado de estoque

Medium

Visão geral

Um estado em que versões antigas de endpoints de API são deixadas expostas sem a aplicação de patches de segurança. Também conhecido como shadow APIs ou APIs zumbis.

Mitigações

🔟 API10:2023 - Consumo inseguro de APIs

Medium

Visão geral

Uma vulnerabilidade em que as respostas de APIs de terceiros são confiáveis sem validação. Se uma API externa for comprometida, o impacto se propagará para o seu próprio sistema.

JavaScript Validação de resposta de API externa
const Ajv = require('ajv');
const ajv = new Ajv();

// Validação de respostas de API externas com um esquema
const externalSchema = {
  type: 'object',
  required: ['id', 'status'],
  properties: {
    id: { type: 'string', maxLength: 50 },
    status: { type: 'string', enum: ['active', 'inactive'] },
  },
  additionalProperties: false,
};

const validate = ajv.compile(externalSchema);

async function fetchExternalData() {
  const res = await fetch('https://api.external.com/data');
  const data = await res.json();

  if (!validate(data)) {
    throw new Error('External API response validation failed');
  }
  return data;
}

📊 Tabela de resumo

ID Vulnerabilidade Gravidade Principais medidas de mitigação
API1Broken Object Level AuthorizationCriticalVerificações de autorização em nível de objeto
API2Broken AuthenticationCriticalGerenciamento adequado de tokens e proteção contra força bruta
API3Broken Object Property Level AuthorizationHighFiltragem de campo de resposta explícita
API4Unrestricted Resource ConsumptionHighLimitação de taxa e restrições de tamanho de carga útil
API5Broken Function Level AuthorizationHighControle de acesso baseado em função
API6Unrestricted Access to Sensitive Business FlowsMediumCAPTCHA e limitação de taxa em nível comercial
API7Server Side Request ForgeryHighValidação de URL e bloqueio de IPs privados
API8Security MisconfigurationMediumCabeçalhos de segurança e configuração de CORS
API9Improper Inventory ManagementMediumGerenciamento de inventário de API e políticas de depreciação
API10Unsafe Consumption of APIsMediumValidação de esquema de respostas de API externas