TIL: Você pode fazer requisições HTTP sem curl usando Bash /dev/TCP
O recurso pouco conhecido do Bash `/dev/tcp` pode ser usado para abrir sockets TCP brutos e montar manualmente requisições HTTP/1.1 simples, o que é útil em ambientes Docker ultraminimalistas ou “distroless”, onde ferramentas como curl, wget ou nc não estão instaladas. Os comentaristas destacam usos como health checks, testes de conectividade, testes de invasão em shells restritos e paralelos históricos como conversar com HTTP e SMTP via telnet. Ao mesmo tempo, muitos alertam que isso não substitui um cliente HTTP de verdade — não há HTTPS, é específico do Bash e não do POSIX, e o tratamento de erros é frágil — e discutem a troca entre imagens enxutas para segurança/conformidade e o valor operacional de ter utilitários de depuração padrão disponíveis por padrão.
Visão geral do recurso: Bash /dev/tcp e /dev/udp
- O Bash expõe pseudo-caminhos especiais
/dev/tcp/host/porte/dev/udp/host/portque abrem sockets TCP/UDP. - Este é um recurso do Bash (e historicamente do KornShell), não POSIX;
dashe muitos outros shells não o suportam, e algumas distribuições já o compilaram sem esse recurso no passado. - Não é um dispositivo ou sistema de arquivos real como o
/netdo Plan 9; é um mecanismo interno do Bash.
Usos práticos e truques
- Uso comum: conectividade rápida entre contêineres ou verificações de health check quando ferramentas como
curl,wget,ncoutelnetnão estão instaladas. - Pessoas o usam em
HEALTHCHECKs do Docker, imagens mínimas, contêineres de bibliotecas em CI/CD e ambientes restritos. - Útil para verificações simples de porta, requisições HTTP GET básicas, port knocking, mensagens de controle UDP “fire-and-forget” e depuração pontual.
- Também é usado em testes de invasão e CTFs quando apenas um shell básico está disponível.
HTTP vs. TCP e limitações
- Vários comentaristas destacam que o Bash apenas abre TCP; o usuário está falando HTTP manualmente.
- Funciona para requisições HTTP/1.0/1.1 triviais, mas não lida de forma robusta com redirecionamentos, proxies, codificações ou análise completa de HTTP.
- HTTPS, HTTP/2 e HTTP/3 estão essencialmente fora de escopo; ferramentas como
curl,socat,openssl s_clientou bibliotecas apropriadas são recomendadas. - Usar isso como cliente HTTP de uso geral é descrito como frágil e “nível de brinquedo”.
Imagens mínimas / distroless e trade-offs de depuração
- Alguns defendem imagens extremamente mínimas ou
FROM scratch(muitas vezes com binários estaticamente ligados) para reduzir a superfície de CVEs e o ruído de conformidade. - Outros argumentam que omitir ferramentas básicas (
curl,coreutils, editor etc.) torna a depuração no mundo real desnecessariamente dolorosa. - As mitigações sugeridas incluem contêineres de debug/efêmeros,
kubectl debug,nsenter+ chroot e anexar ambientes separados e ricos em ferramentas. - O debate gira em torno de se os benefícios de segurança superam o atrito operacional e se isso realmente aborda a superfície de ataque real ou apenas os scanners de segurança.
Contexto histórico e conceitual
- Vários relembram falar manualmente protocolos (HTTP, SMTP, POP3, IRC) via
telnetou ferramentas similares; esse truque é visto como uma variante moderna. - O
/netdo Plan 9 e as APIs de rede do Go são mencionados como predecessores conceituais desse estilo de rede-como-arquivos.