1 pontos por GN⁺ 2 시간 전 | 1 comentários | Compartilhar no WhatsApp
  • O desenvolvimento de relayd(8) e httpd(8), que estava estagnado com a perda de interesse dos desenvolvedores tradicionais do OpenBSD, voltou a ganhar ritmo com a participação de contribuidores que tinham demanda real em produção
  • Partindo da ideia de que, justamente na era em que os LLMs passam a substituir conhecimento de programação, é preciso aprender C e encarar o desafio diretamente, o trabalho começou modernizando o sistema artesanal de imsg do relayd(8)
  • Foram revisados e em grande parte resolvidos os patches não incorporados da lista tech@ entre 2024 e 2026, além de issues antigas do mirror no GitHub, e também foram preparados um mirror Git e README para novos contribuidores
  • O relayd(8) reforçou a segurança da API de imsg, do TLS e do parsing de requisições, além de corrigir conflitos de recarga; o httpd(8) adicionou defesa contra request smuggling, cabeçalhos personalizados e controle de cache para arquivos estáticos
  • Segurança, estabilidade e escalabilidade dos dois daemons avançaram juntas, mas o trabalho também aumentou o backlog, e ideias e feedback continuam sendo bem-vindos

O contexto de reviver um projeto que havia perdido interesse

  • Como tratado em principais mudanças do OpenBSD 7.8, o desenvolvimento de relayd(8) e httpd(8) estava parado
    • Vários contribuidores enviaram patches para a lista tech@, mas quase nada foi incorporado ao repositório
    • A principal causa foi que os desenvolvedores tradicionais do OpenBSD já não tinham mais interesse nos dois daemons
  • Junto com kirill@, o autor passou a desenvolver os dois daemons ativamente com base na experiência de usá-los regularmente e lidar com casos reais de uso
    • A demanda prática de dar suporte a clientes OpenBSD com configurações complexas de httpd(8) e relayd(8) também foi um impulso direto

Por que voltar ao C na era dos LLMs

  • O maior gatilho foi o surgimento dos LLMs
    • No passado, o autor escrevia código moderno em C++ de forma especializada, mas depois migrou para arquitetura de soluções, engenharia de plataforma e formação de equipes, deixando quase totalmente de programar no dia a dia
    • Acabou ficando mais em escrever YAML declarativo e ler/portar código para o ports(7) do OpenBSD
  • Ao contrário da ideia de que “programação está resolvida”, concluiu que, quanto mais o conhecimento é delegado para fora, mais importante é possuir esse conhecimento diretamente
  • C++ e Rust assumem parte das decisões difíceis, mas C não faz isso; por isso, o autor tomou isso como desafio e decidiu contribuir para relayd(8) e httpd(8)

Contribuição sustentada por disciplina, não por motivação

  • Contribuir em open source pode terminar em frustração em poucas semanas, mas depois da fase inicial mais dolorosa foi possível entrar em um ritmo de trabalho constante
  • No começo, ler a base de código de forma passiva foi desanimador em vários pontos
    • A causa eram comentários insuficientes, algumas decisões ruins de projeto e código muito entrelaçado; ainda não está claro se isso é característica de código C ou falta de experiência pessoal
  • Após discutir com os mantenedores dos daemons do OpenBSD, decidiu-se modernizar o sistema artesanal de mensagens imsg
    • Primeiro com foco em relayd(8), depois ampliando o escopo para httpd(8)
    • O próprio trabalho de modernização foi usado como meio para entender a base de código

Limpeza de patches não incorporados e issues antigas

  • Foram revisados os registros da lista tech@ entre 2024 e 2026 para reunir patches e issues pendentes, e a avaliação é que a maior parte já foi tratada
  • Os dois daemons foram originalmente desenvolvidos por Reyk Floeter, hoje aposentado do OpenBSD
  • Também foram revisadas issues antigas do mirror do relayd no GitHub, mantido por Reyk
    • Todas as issues podem ser encerradas ou corrigidas, e algumas já não são mais válidas

Um mirror Git para novos contribuidores

  • Inspirado no mirror já existente no GitHub, foi criado um mirror separado para facilitar a entrada de novos contribuidores mais jovens e criar um ponto de contato com a comunidade fora das listas de e-mail do OpenBSD
  • A árvore CVS é usada como mirror Git, com o desenvolvimento acontecendo primeiro em uma instância do Gothub e depois sincronizado com os demais repositórios
  • O mesmo método foi aplicado a httpd(8), com a criação de um README.md detalhado com as informações necessárias

Modernização e qualidade de código no relayd(8)

  • O sistema de imsg foi migrado para acessores mais seguros: imsg_get_data, imsg_get_type e imsgbuf_get
  • Foi adicionada tratativa de erro adequada em todo o processo de leitura do payload de imsg
  • Logging e comentários foram padronizados para ficar consistentes com bgpd
  • O tratamento da linha inicial HTTP foi separado em uma função dedicada, melhorando a organização do código
  • Foi aplicado o formato knfmt

Reforço de segurança no relayd(8)

  • A cifra TLS padrão foi alterada de HIGH:!aNULL para secure
  • Foi adicionado suporte a ECDSA no mecanismo de privilégio separado (privsep) da CA
  • Cabeçalhos Content-Length duplicados passam a ser rejeitados com resposta HTTP 400
  • Cabeçalhos obs-fold não são permitidos, para evitar diferenças entre parsers conforme a RFC 9112 5.2
  • Foi adicionada verificação de ID de processo, e IMSG_CTL_PROCFD passou a ser restrito ao processo pai
  • explicit_bzero passou a ser usado para apagar dados sensíveis de senha

Correções de bugs e melhorias de estabilidade no relayd(8)

  • Foi corrigida uma condição de corrida na recarga que causava crashes
  • Vários vazamentos de memória ligados a X509_dup, config_purge e tls_cfg foram eliminados
  • Foram corrigidas verificações de NULL e de limites
  • Foi adicionada tratativa de erro adequada para falhas do OpenSSL
  • Em falhas de TLS, a fila de erros do OpenSSL agora é esvaziada

Recursos adicionados ao relayd(8)

  • Suporte ao método HTTP MKCALENDAR
  • Passou a ser possível usar TLS em vários listeners
  • Suporte a vários endereços com resolução de nome
  • Agora é possível definir explicitamente os caminhos de certificado, chave e OCSP staple
  • Requisições de health check HTTP podem definir User-Agent
  • Respostas HTTP sem corpo agora são tratadas corretamente

Modernização e qualidade de código no httpd(8)

  • proc.c foi migrado para a nova API de imsg, alinhando a consistência com relayd(8)
  • A ordem dos tokens foi alterada para facilitar futuras expansões das opções de configuração
  • O logging foi padronizado para ficar consistente com bgpd
  • Código duplicado e funções vazias foram removidos
  • Foi aplicado o formato knfmt
  • O tratamento de funcionalidades embutidas foi separado em funções dedicadas

Reforço de segurança no httpd(8)

  • A cifra TLS padrão foi alterada de compat para secure
  • O enquadramento de requisições CL.TE agora é rejeitado para bloquear ataques de request smuggling
  • Cabeçalhos obs-fold passam a receber HTTP 400 conforme a RFC 9112 5.2
  • A presença simultânea de Content-Length e Transfer-Encoding passa a ser tratada como erro
  • Um relink aleatório é executado no boot como proteção adicional
  • Foi adicionada verificação de ID de processo, e IMSG_CTL_PROCFD passou a ser restrito ao processo pai
  • Foi adicionada a opção no banner para ocultar informações de identificação do servidor na resposta

Correções de bugs e melhorias de estabilidade no httpd(8)

  • Foi corrigido o tratamento de suffix range em requisições HTTP
  • server_http_time() foi corrigido para emitir corretamente horário em GMT
  • Erros de timegm(3) agora são verificados conforme especificado no manual
  • Foram resolvidos problemas em uploads com chunked transfer-encoding
  • Foi corrigido o envio duplicado de fcgiparams em location
  • Foi adicionada tratativa de erro adequada em dispatch_parent
  • Respostas abortadas agora são drenadas corretamente via bufferevent
  • Armazenamentos desnecessários encontrados pelo scan-build foram removidos
  • return_uri_len agora é validado antes de copiar os dados

Novos recursos no httpd(8) e trabalho restante

  • Suporte a cabeçalhos HTTP personalizados
  • gzip-static agora é herdado em location para melhorar a herança de configuração
  • As flags do servidor foram expandidas para inteiro de 64 bits para comportar mais opções
  • Foi adicionado controle de cache para arquivos estáticos
  • À medida que o trabalho avançou, o backlog também cresceu, e ideias e feedback para o desenvolvimento futuro continuam sendo aceitos

1 comentários

 
GN⁺ 2 시간 전
Comentários no Lobste.rs
  • Fico feliz com o suporte a cabeçalhos HTTP personalizados. Antes, por falta desse recurso, eu não conseguia usar o httpd nem para casos simples, então é ótimo saber que agora ele é suportado

  • O desenvolvimento do relayd(8) e do httpd(8) estava estagnado, e vários contribuidores enviaram patches para a lista tech@, mas quase nada foi incorporado ao repositório. Ao que parece, o principal motivo foi que os desenvolvedores antigos do OpenBSD não tinham mais interesse nesses daemons, então sou grato a quem assumiu a manutenção

  • Uso os dois softwares regularmente, então fico feliz em ver que eles estão sendo bem mantidos de novo. Eu não fazia ideia de que o desenvolvimento tinha ficado parado
    Graças à estrutura simples do software, parece que foi possível retomar o desenvolvimento e incorporar toda essa quantidade de recursos e correções sem precisar de uma equipe grande

  • Por um bom tempo eu fiquei confuso com o número depois do nome do software, mas descobri que ele indica o número da seção do manual
    1 significa programas executáveis e comandos de shell, 2 chamadas de sistema, 3 chamadas de biblioteca, 4 arquivos especiais, 5 formatos e convenções de arquivo, 6 jogos, 7 diversos, 8 comandos de administração do sistema, e o 9 não padronizado indica rotinas do kernel

    • Basta executar man 1 man ou, de forma curta, man man para verificar o man(1). Em especial, várias páginas intro em SEE ALSO são úteis
  • Fico curioso se essas melhorias vão entrar no OpenBSD 8.0

  • Fico me perguntando se o link foi feito para ser legível desde o começo. No Firefox para Android ele aparece assim
    https://imgur.com/a/oTimS9R