Рубрики
Uncategorized

Devesecops — Ataque de Alteração de Parâmetros da quisição.

Segurança Para devs Este Post Faz Parte de Uma Coleção de Postes Sobre Segurança de Softwar … Теги с безопасностью, DevOps, WebDev.

Devesecops — Segurança Para devs (6 серий части)

Segurança Para Devs.

Este Post Faz Parte de Uma Coleção de Posts Sobre Segurança de Software Ao Longo Do Processo de Desenvollimento (Devesecops). O Tipo de VulnerabiliDade Abordado Neste Artigo É Alteração de parâmetros da quisição Отказ

Tradução Deste Nome É Livre, Mas O Termo Mais Comum, EM Inglês, é Параметр вмешательство Отказ Головной проход Conferir A Documentação Нет Catálogo da Owasp 1 Отказ

Pasinentamente, Параметр вмешательство Состоит Em Qualkquer Tipo de Exploração de Segurança Baseada Em Альтерэр Как informações que uma repakação Cliente Envia Para o Servidor (EX: UMA Requisição Rest OU UM Formulário HTML), AFIM de Obter ResultaDos Diferentes, Como Acessar Informações di Automos usuários ou alterar informações ue, normalmente por dressições de ui, Não Seria Tossíval.

Alguns exemplos do que Pode Ser Feito Com Esse Tipo de Exploração:

  • EM UM Sistema Com Troca de Mensagens Instantâneas (чат), Poder Encifar UMA Mensagem SE Passando POR Outra Pessoa (Usuário X Encia Mensagem Para Usuário COMO SE FOSSE USURIO B).
  • Em Sistema de Vendas, Poder alterar o Valor do desconto de Uma Compra.
  • Эм Хм Система де Растреамендо, Poder Acompanhar Antrega de Um Pedido de Outra Pessoa.

POR SE TRATAR DE UMA GAMA BEM AMALA DE ATAQUES, Vamos Foar Aqui Nos Проблема que Podem Ser Resolvidos Com Design De Apis E UM Puquinho de Código. PARA ISSO, Vamos Tomar Seguinte Especificação de Funcionalidade:

COMO USUáRIO DEM добиваться коммерции Estando Autenticado Narea Do Cliente QuAndo Acessar «Meus pedidos» Então devo visisionizar pedidos realizados apenas pelo mesmo usuário que está autenticado

ГОСТО DESSE Exemplo, Pois ilustra Bem Uma Situação Correicaliira EM Equipes de Desenvollimento: Крем-консультаций по-дадо. AxtryAmos Esse Tipo de Consulta A ToDo Momento, Por Centenas de Vezes e Em Muitos Sistemas, Mas Nem Semper Assamos o nível de permissão de Acesso à Essas Consultas.

Para Para Atdend Tuncallidade Descriatha Acima, Suponhamos Seguinte Modelagem Do Servidor, Seguindo A Arquitutura Rest:

GET /api/usuarios/{id}/pedidos
Authorization: token-do-usuario-id-{id}

Provivelmente A Allogina Em Alto Nível (Python) 2 , Para Atdender à Esta Rota, Seria Algo Como:

@app.route('/usuarios//pedidos')
def pedidos_unsafe(id_usuario):
    token = decodificar_token(request)
    if not token['valido']:
        abort(401) # Unauthorized
    return consultar_pedidos(id_usuario)

Aparnentemente, Não Há Nada de Errado Com O Código Acima. Фунчано Декодификар_token Интерпретация о Cabeçalho Авторизация (EnviaDo Com A requisição), e confere se o token 3 Está Válido (Na Grande Maioria Dos Casos, Essa Validação содержит Em Verificar Se o Preenchimento Do Token Está Correto e Se o Mesmo Não Exhirou Ou Poy Disharado Por Empo Throca de Senha, Por Exemplo -). Caso Esteja Válido, O Sistema Prossege O Fluco, Consultando (No Banco de Dados) Пелос Педидос Реферат АО I d enviado na quisiisição.

Porém, Além de Não Atdender à Essificação 4 Esta ExplaiTação Expõe Uma Falha de Segurança. Примечание que apesar de validarmos o Токен, NãO VERICTAMOS SE O U USUARIO REACINADO AQUELE TOKENE É O MESMO USUARIO REQUIBICO NO PARâMETRO DA TEQUISISIção | Отказ Aqui Está Brecha Para o Параметр вмешательство Pois Podemos Encify o Токен Para usuário 1 E Ainda Assim Pedir OS DODOS DO USUARIO 2:

GET /api/usuarios/2/pedidos
Authorization: token-do-usuario-id-1

UMA Forma Smple de Evitar Esse эксплуатировать Серия Garantir Que o Usuário Do Token É O Mesmo Informado Нет Parâmetro :

if token['id_usuario'] != id_usuario:
    abort(403) # Forbidden

AdvolationAção Завершиться:

@app.route('/usuarios//pedidos')
def pedidos_safe(id_usuario):
    token = decodificar_token(request)
    if not token['valido']:
        abort(401) # Unauthorized
    if token['id_usuario'] != id_usuario:
        abort(403) # Forbidden
    return consultar_pedidos(id_usuario)

Правительство! Agora As quisições que queus o Argento id do Usuário дифференциал ID DO USUARIO VINCULADO AO TOKEN SERãO REPPTIDIDAS COM UM Código de erro DO Servidor 403 (Запрещено).

Подемос Fazer Duas Smples Evoluções:

  1. Центрационная единица ESTA Lógica de Verifeyação de Token X Parâmetro de Query, Pois Provivelmente Muitas Rotas Terão Essa Brecha; e
  2. Quando Algum Usuário Tentar Acessar Informações que Não São Suas, Регистрация Esta Intenção Para Futuras Auditorias.

Centralizando E Unifannanno Как реформируют де Сегуранса

Para o Pitter 1, Podemos Utilizar O Padrão de Projeto Декоратор Председателю Nativamente EM Lingugens/Frameworks Como Python, Java E C # OU Функции высшего порядка Para Lingugens Funcionais que ainda não Помоситель ubupe a o.

@app.route('/usuarios//pedidos')
@garantir_mesmo_usuario(nome_argumento='id_usuario')
def pedidos_safe(id_usuario):
  return consultar_pedidos(id_usuario)

Neste Caso, Toda «Mágica» FICA POR CONTA DE garantir_mesmo_usuario 5 UMA Função Decoradora Que NoS Premite Executar Código Антес е Депоис Da Adveryação que desejamos Executar Quando Rota для Acionada POR UMA Applação Clients (Neste Exemplo, Consultar Pedidos). DESTA FORMA, CONSGUGUIMOS Reduzir Bastante O Código E Aninda ReaProveiatar Esta Lógica EM Outros Pontos de Alteração. Allognalação делает декоратор Поде от Ser Conferida Нет ссылки Нет Final Deste Artigo.

Абитаменте, Poderíamos Crar Esse Comportamentamento de Veriveristar A Segurança EM UMA Função Externa Que «Empacota» ( Wrapper ) AllogyAção Da Consulta (Exemplo Para Node.js Express):

app.get('/usuarios/:idUsuario/pedidos',
  garantirMesmoUsuario(async (req, res) => {
      const { params: { idUsuario } } = req
      const pedidos = await consultarPedidos(idUsuario)
      res.send(pedidos)
    }
  )
)

Perceba Que. гарантирмиЕСМУСУАРО é um função que recebebe como ArgageO … UMA Outra Função. Essa «Outra Função» E AllogyAção que desejamos Executar Quando Rota /USUARIOS/: IDUSUARIO/PEDIDIDOS Для ационады Com o Método Get. Sameiro Fazemos As Verifeações devidas de Segurança, E Aí invocamos a «Outra função» EM Вернуть Func (REQ, RES) :

const garantirMesmoUsuario = func => (req, res) => {
  const token = decodificarToken(req)
  if (!token.valido) {
    return res.sendStatus(401)
  }
  const { params: { idUsuario } } = req
  // comparação estrita vai falhar se token.idUsuario for Number
  // e idUsuario for String
  if (token.idUsuario !== idUsuario) {
    return res.sendStatus(403)
  }
  return func(req, res)
}

ESTA AdvolationAção Funciona de Forma Muito подобное AOS Mecanismos de промежуточное программное обеспечение Председают EM Alguns Frameworks Para Desenvollimento Web, COMO Экспресс е Джанго Отказ

Registrando Tentativas de Acesso Inadquado

Agora Que Temos Toda Estrutura de Verifeação Centralizada, É Fácil Registrar As Tentativas de Acessos Inadequados. Программное обеспечение ISSO Code Ser Gathere Caso O Esteja Sob Tentativas de Ataque ou Se Algum Usuário Teve Suas Credenciais ComproommotiDas, Permitindo Ao Sistema Reagegir Corretamente A Isso.

    if token['id_usuario'] != id_usuario:
+       registrar_tentativa(token, id_usuario)
        abort(403) # Forbidden

Registrar_tentativa é uma função que que Poore Gravar Tentativa Нет вывода DO Sistema (Geralmente UM STDOUT de Terminal), EM ALGUM ARQUIVO de log Transacional, EM ALGUM BANCO DE DADOS GERENCIADO OU EM EMM SERVIçOSO ESCESIALIZADO DE PLACHINGE DE LOGES DE AUDITORIA ( AWS CloudTrail, Лос, PaperTrail, и т. Д.).

ОС DECALHSES DE AIMLIESACAO DESTA FUNCHãO SãO, COMO O PROROIO TERMO DIZ, DIZALHS. O que importa é que seu sistema Armazene Estas Informações Е Сайба Reagir Coreetamente Essas Tentativas de Acesso. POR Exemplo: Enviar UMA Notifeatação Para usuário Sobre o Acesso Inadequado E Invidear Todos OS Tokens Relacionados ELE.

«UX Também É Segurança!»

(Alguma Pessoa Lúcida, EM Algum Momento Lúcido)

Lembre-Se: Segurança de informação não épenas sobre tecnologias, frameworks e padrões que inserimos no código e na arquitetura Отказ É Também Sobre Projetar Flucose E Interações Com O Usuário Final Que Garantam A Máxima Integidade de Todos OS Dados Que Forem Tratados No Uso Do Software.

Редактировать 1: Essa Vulnerabilidade de edhnar o id do recurso SER CONSUSADO TAMBÉM E CONHECIDA COMO Бола (Разрешенная разрешение на уровне объекта) ou outor (небезопасна прямая ссылка на объект) (Créditos @jradesenv. ) . Porém, параметр Tampering Automs Tipos de Explorações, Como Veremos Seguir.

Арус рассматривает

Nem Semper OS Parâmetros Que Podem Ser alterados Estarão Na URL Da Requisição, É Preciso Cuidar OS CAMPOS QUE PODEM SER ENVIADOS NO CORPO OU ATÉ MESMO OS Cabeçalhos. Exemplo:

POST /api/mensagens
Authentication: token-usuario-id-1

{
  "de": 2,
  "para": 3,
  "mensagem": "oi! pode me passar seu endereço?"
}

SE NADA для Feito No Servidor (Backend), Ésisível Mandar Mensagem do Usuário 2 Para 3 Tendo Apenas As Credenciais Do Usuário 1, Que Pode Ter Sido Criado Simplemente Para Executar Algum Ataque. Essa Alteração de Parâmetros Acontece Нет Campo Де (ID Do Usuário Remetente).

Code Ser Mais Fácil Exploorar Esta Vulnerabilabilidade SE OS Identialadores únicos dos usuários forem incriptyAis (ex: 1, 2, 3, … 10401), Facilitando A VIDA de Quem для Executar O Ataque (OU ATÉ MESMO ESCREVER UM Script Para Automatizar o эксплуатировать ). Ждет incrementaiss Também Podem Trazer Flowerase de Concorrencia de Escrita (Embora Nos últimos Anos As Tecnologias de Banco de Dados Tenham Evoluído Bastante Nesse Aspecto). Prefira Abordagens de Identialação única com baixa previsibilidade Como. UUID ou Привет/lo Действительно

Outra VulnerabiliDade Muito Comum Реферант A Параметр отпуск é o acesso inreverito informações Retirando Parâmetros Esceizicos (COMO ID DE BUSCA) E ACESSANDO TODOS REGINGROS DE UMA TABELA (Consulta Mais Ampla SEM Filtros), Também Conhecido Como Разбитая функция Авторизация доступа Tomemos как Seguintes Especificações:

FuncalliDade: Detalhar Pedido EsseciCo Como usuário do ecommerce Estando Autenticado Narea Do Cliente QUANDO ENTRAR EM «MEUS PEDIDOS» E ECCOLHER O PEDIDIDO 1 Antão deve abrir a tela com os dehous do do Pedido 1

Funcallidade: Listar Todos Pedidos Como Usuário Администратор делает электронную коммерцию E Estando Autenticado Narea Adminivalativa QUANDO CLICAR нет товара «Todos OS Pedidos» сделать меню Então Devo Visualizar Todos OS Pedidos Должен ли электронную коммерцию

PARA A PAMEIRA FUNCALIADADE, PODEMOS API API SEGUINTE:

GET /api/pedidos/{id}
Authentication: token-do-usuario-{id}

PARA SEGUNDA FUNCORIALIDADE:

GET /api/pedidos
Authentication: token-do-usuario-admin

Porém, SE NADA для Feito, O Usuário 1 (que não é a.udiamentor), Poderá Acessar /API/Pedidos APENAS RETIRANDO O ID DO DO PEDIDO DA URL, Poddo então Visualizar Toos OS Pedidos. AO CRAIR WEBS APIS QUE VãOO EXPOR DADOS DE FORMA AMPLEA E COM PUCOS FILTROS, ЧТОБЫ СПИСОК quem deve Poder Acessar Essas Informações E Faça OS Devidos Adjustes, Pois Comm um Conhecimento Básico de Web E Protocolos de Rede, és osível Tentar Acessar Praticamente Todos OS Dados Que Seu Sistema «Expõe» Para в качестве копии утилизарем.

MUITOS Frameworks Web Jasuem Mecanismos Para Auxiliar Autorização POR Diferentes Papéis de Usuários (роль на основе роли), Exemplo DOS Decoradores de Autorização do Django ou a Anotação @secured Do Spram Framework Отказ Consultte Документальныйação das tecnologias que vovo ashaus antes de escrever maluemente rsses filtros!

Вывод

Esse Tipo de Vullinabilabilidade NoS Parâmetros de requisições nem semper é fácil de Идентифицирован Формас Mas Elenco Algumas Práticas Que Podem Ajudar Na Grande Maioria Dos Casos:

  • Анкета, o Canto Antes e de forma contínua, que Tipo de Papéis de Usuário Poderão Acessar As Informações que serão dosponibilizadas. Refleins как рекостас нет desenho da solução.
  • Analisar Todos OS Parâmetros Que São Trocados Entre Camada Pública (Cliente) E Camada Privada (Servidor). Идентифицированные Quais Desses Parâmetros:
    1. SãO UTILIZADOS PARA Localizar Registros Que Podem Ser Lidos ou ALTERADOS (EX: IDS de Busca). Анкета o Quanto o Usuário Que está autenticado (Seja Por Token, cookie, Sessão, и т. Д.) Поде elistar dos parâmetros destes parâmetros Elencados.
    2. Precisam Ser Re-Validados (Além da Validação Já realizada na camada de ui). POR Exemplo, Em Sistema Com Rendição de Idade, É Preciso Garantir, No Servidor, Que o Campo «DE NO NASCIDOO» ATEND às a. Поде от Ser alterada Fora Da Alokação Client Confialvel.
  • SEMPER Que Tossível, Предпочтитель Mecanismos de Geração de Identialadores únicos de Baixa Previsibilidade, Como OS JA Citados Uuid OU Привет/вот
  • Desenvolva UMA Visão «Caixa Preta» E Analish A API COM UMA Perspectiva Externa, SEM DECHALHSE DE AIRTIMEACãAO. O que uma pessoa maliciosa poderia tentar fazer com Как Urls e Parâmetros Públicos?
  • Принципал TENTE INCUTIR AS PRATICAS E REVISõES de Segurança de Informação Na Cultura de desenvolvimento Precupações e Tarefas Em Precupações E TAREFAS EM PRECECUPAçesE.

Segurança Da Informação Também É Qualidade de Software!

  1. А Owasp É UMA Comunidade Muito Valiosa Em Segurança de Informação. Emper Muito Geature Estarmos atentos aos dados e relatórios periódicos que eles peavelam! ↩

  2. POR Motivos Didáticos E de Brevidade, Allognalação emite algumas defordições de Funções, Rotas, Servidor и т. Д. SE VOCO QUISER TODOS ОС ДЕТАЛЛЫ, CONFIRA A ИСПЛУАТАЖАСАСАС ЗАВЕРШЕНИЯ Отказ ↩

  3. TODOS OS Exemplos Podem Ser Serf Internetados Com Qualkquer Mecanismo de Autenticação (токен, cookie, ID сеанса и т. Д.). POR SERME DAS ABORDAGENS MAIS популярны Atualmente, Utilizaremos Ao Longo Do Atteigo Autenticação POR TOKEN. ↩

  4. É Comum que as Esceptificações (Независимо от Formato) NãO Contenham Algumas Precupações Básicas de Segurança. Neste Caso, o Critério de Aceite Pode Aparecer Como «Então Devo Visualizar Pedidos» Отказ Ума Pessoa Que Trabalha Com Produtos Digitais Deve SE PROCUPAR COM MUITAS COISAS, Então é Complectemente Comeensível que alguns detalhes de segurança passem desapercebibibibibistos, por iso a Импортируют da equipe de desenvolvimento se precupar com Infosec de uma forma iterativa ao longo das enterategas (e não apenas no final dos projetos através de auditorias), Revisando As Esperificações e Fortalecendo UMA Cultura Onde QualiDade de Software Está Diretamente Relacionada à Segurança de Informação. ↩

  5. Também Por Motivos Didáticos E De Brevidade, Função Decoradora garantir_mesmo_usuario Возможны Duas Repainabilidades: 1) Veriveristar Se o Token é válido; e 2) Veriveristar Se o Usuário Do Token É O Mesmo Da Requisição. EM Termos de Boas Práticas E Design De Código, O Mais Correeto Seria «Deliir» Esta Função EM Duas Menors, Onde Cada Qual Возможна SUA RepainabiDade única. ↩

Devesecops — Segurança Para devs (6 серий части)

Оригинал: «https://dev.to/bernardobrezende/devsecops-ataque-de-alteracao-de-parametros-da-requisicao-4ip9»