Skip to content

[ANCHOR-1398]: Derive request_client_ip_address from a trusted source - #2085

Merged
ceciliaromao merged 12 commits into
developfrom
fix/anchor-1398
Nov 13, 2026
Merged

ceciliaromao merged 12 commits into
developfrom
fix/anchor-1398

Conversation

@ceciliaromao

Copy link
Copy Markdown
Collaborator

Description

  • request_client_ip_address (SEP-6/24/31) agora é derivado de uma fonte confiável: o endereço do peer TCP, ou o cliente real lido de X-Forwarded-For somente quando o peer está na nova lista sep_server.trusted_proxies.
  • A lista aceita IPs e CIDRs (IPv4/IPv6) e vem vazia por padrão. Com ela vazia, os cabeçalhos de forwarding são ignorados.
  • X-Forwarded-For é lido da direita para a esquerda, pulando proxies confiáveis. Uma entrada que não é um IP literal faz o valor cair para o peer, sem resolução de DNS.
  • O IP agora é calculado em toda requisição, com app_logging.request_logger_enabled ligado ou desligado. A linha de log e a mensagem TRACE do RequestLoggerFilter usam o mesmo valor.
  • IPv6 é gravado na forma canônica, e qualquer grafia do loopback IPv6 vira 127.0.0.1.
  • Uma entrada inválida em sep_server.trusted_proxies impede o startup, com mensagem que cita a chave e a entrada.
  • Removida a leitura dos 12 cabeçalhos candidatos (X-Real-IP, Proxy-Client-IP, HTTP_* etc.) em RequestLoggerFilter.

Context

  • Antes, o campo só era preenchido quando o request logger estava ligado (default false), então vinha null em toda transação por padrão.
  • Com o logger ligado, o valor era o primeiro token do primeiro cabeçalho presente, sem noção de proxy confiável. Quem enviava X-Forwarded-For ou X-Real-IP escolhia o valor repassado ao business server.
  • O business server recebia ou nada, ou um valor escrito pelo chamador, rotulado como IP do cliente.
  • O vazamento do mesmo campo nos logs é tratado à parte, em ANCHOR-1395.
  • HackerOne report 4108145.

Testing

  • ./gradlew test
  • ./gradlew :platform:test (1466 testes, 0 falhas) e ./gradlew spotlessCheck
  • Novos testes em platform: TrustedProxiesTest (fronteiras de CIDR, IPv4 e IPv6), ClientIpResolverTest, RequestLoggerBeansTest, SepRequestHelperTest, ClientIpControllerTest, SepServerConfigAdapterTest, além de casos novos em RequestLoggerFilterTest e ConfigManagerTest.
  • Rodada de mutações com 6 mutações injetadas no código de produção, todas mortas pelos testes.
  • Não rodei os essential-tests (e2e) localmente. A asserção 127.0.0.1 em PlatformApiTests deve continuar valendo, pois o cliente local é o próprio peer.

Documentation

A nova chave sep_server.trusted_proxies está documentada em anchor-config-default-values.yaml, incluindo a consequência do default vazio.

  • stellar-docs PR: TODO anexar, se a documentação pública de configuração precisar listar a nova chave.

Known limitations

  • Quem roda atrás de ingress ou load balancer (por exemplo o helm chart sep-service) passa a gravar o IP do proxy até configurar sep_server.trusted_proxies. Os valores de proxy do chart não foram definidos aqui porque são específicos de cada deploy.
  • X-Real-IP e os demais cabeçalhos legados deixam de ser lidos.
  • Entradas de X-Forwarded-For com porta (1.2.3.4:5678) não são suportadas: contam como inválidas e o valor gravado é o peer.
  • Linhas já gravadas em sep6_transaction, sep24_transaction e sep31_transaction não são reescritas.

@ceciliaromao ceciliaromao self-assigned this Oct 28, 2026
@ceciliaromao
ceciliaromao merged commit 6d51f60 into develop Nov 13, 2026
22 checks passed
@ceciliaromao
ceciliaromao deleted the fix/anchor-1398 branch November 13, 2026 15:23
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants