Desenvolvedores Rust resistem após o projeto Serde enviar binários pré-compilados
21 de Agosto de 2023

Serde, um projeto popular de (des)serialização Rust, decidiu entregar sua macro serde_derive como um binário pré-compilado.

A decisão gerou uma certa resistência entre os desenvolvedores que se preocupam com as futuras implicações legais e técnicas, junto com um potencial para ataques à cadeia de suprimentos, caso a conta do mantenedor que publica esses binários seja comprometida.

De acordo com o registro de pacotes Rust, crates.io, o Serde foi baixado mais de 196 milhões de vezes ao longo de sua vida, enquanto a macro serde_derive chegou a mais de 171 milhões de downloads, atestando a ampla circulação do projeto.

Cerca de três semanas atrás, um programador Rust que usava o projeto Serde em sua aplicação notou algo estranho.

"Estou trabalhando no empacotamento do serde para o Fedora Linux, e percebi que as versões recentes do serde_derive agora vêm com um binário pré-compilado", escreveu Fabio Valentini, membro do Comitê de Empacotamento do Fedora.

"Isso é problemático para nós, já que não podemos, sob nenhuma circunstância (com pouquíssimas exceções, para firmware ou algo do tipo), redistribuir binários pré-compilados."

O Serde é um framework de (des)serialização comumente usado para estruturas de dados Rust que, segundo seu site, é projetado para realizar essas operações de forma "eficiente e genérica".

"O ecossistema Serde consiste em estruturas de dados que sabem como se (des)serializar, além de formatos de dados que sabem como (des)serializar outras coisas", afirma o site do projeto.

Enquanto isso, "derive" é uma de suas macros.

Valentini questionou ainda aos mantenedores do projeto, como foram produzidos esses novos binários e se seria possível para ele recriar os binários, ao invés de consumir as versões pré-compiladas.

David Tolnay, o principal mantenedor do Serde, respondeu com possíveis soluções na época.

Mas isso não quer dizer que todos estão satisfeitos.

Após uma enxurrada de comentários de desenvolvedores sobre por que a decisão não era a melhor para o projeto, Tolnay reconheceu o feedback, antes de fechar o problema no GitHub.

Sua justificativa para a entrega de binários pré-compilados é reproduzida na íntegra abaixo.

"A implementação pré-compilada é a única maneira suportada de usar as macros que são publicadas no serde_derive.

Se houver trabalho de implementação necessário em algumas ferramentas de construção para acomodá-lo, alguém deve se sentir à vontade para fazer esse trabalho (como eu fiz para o Buck e Bazel, que são ferramentas que eu uso e contribuo significativamente) ou publicar seu próprio fork do código fonte sob um nome diferente.

Separadamente, em relação aos comentários acima sobre segurança, o melhor caminho a seguir seria para uma das pessoas que se preocupa com isso investir em um RFC do Cargo ou crates[.]io em torno de macros pré-compiladas de primeira classe, de modo que haja uma abordagem que se adeque às suas preferências; o serde_derive adotaria isso quando disponível."

O BleepingComputer procurou Tolnay com perguntas adicionais antes da publicação.

Alguns desenvolvedores Rust solicitam que os binários pré-compilados sejam mantidos opcionais e separados da crate original "serde_derive", enquanto outros compararam a decisão à controversa alteração de código no projeto Moq .NET que gerou reação negativa.

"Por favor, considere mover a versão pré-compilada do serde_derive para uma crate diferente e defina o serde_derive como padrão para compilação a partir do código fonte, para que os usuários que queiram o benefício do binário pré-compilado possam optar por usá-lo," solicitou um usuário.

"Ou vice-versa.

Ou qualquer outra solução que permita a compilação a partir do código fonte sem ter que modificar o serde_derive."

"Ter um binário enviado como parte do crate, enquanto entendo os benefícios de velocidade de tempo de construção, por razões de segurança não é uma solução viável para alguns usuários de biblioteca."

Os usuários apontaram como a mudança poderia impactar entidades que estão "legalmente proibidas de redistribuir binários pré-compilados, por suas próprias licenças", mencionando especificamente ambientes regulamentados pelo governo.

"...Primeiro o Moq do .NET e agora isso," disse Jordan Singh, um desenvolvedor baseado na Austrália, em um comentário que foi removido mais tarde.

"Se isso é para forçar os desenvolvedores de cargo a suportar um recurso, então essa é uma maneira terrível de fazer isso.

Pelo menos nos dê binários reproduzíveis.

Estou cansado de os desenvolvedores de crates/bibliotecas populares tomar todo mundo como refém com decisões absurdas."

Donald Stufft, com sede na Filadélfia, alertou sobre os riscos de entrar no negócio de "envio de binários" nas redes sociais.

O programador Rust Nathan West, que atende por Lucretiel, destacou especialmente os riscos para a cadeia de suprimentos apresentados por binários pré-compilados, caso a conta do mantenedor seja comprometida.

"Não é exatamente assim que eles fariam isso? Enviá-lo silenciosamente como uma mudança semi-plausível na forma como o serde funciona, ignorando intransigentemente todas as críticas à decisão", escreveu West.

"Esta é *exatamente* a razão pela qual todos têm uma oposição tão reflexiva a movimentos como este."

"A confiança na internet não é perfeita; nós *não* sabemos que é realmente o mantenedor postando no GitHub.

É por isso que temos camadas e proxies de defesa; coisas suspeitas são rejeitadas porque não valem o risco.

O tecnologista Sanket Kanjalkar chamou a transição para o envio de binários sem uma maneira de optar por não participar de "um passo para trás".

Mas um profissional de segurança que atende por Lander tem uma visão um pouco diferente: "Essa polêmica do Rust sobre o serde_derive enviar um binário pré-compilado é meio engraçada", escreve Lander.

"Por um lado, entendo a preocupação das pessoas.

Por outro lado, quem se importa? ninguém está lendo o código macro/ código build.rs para cada projeto que eles puxam de qualquer maneira.

Uma opção de opt-out seria uma boa ideia, porém."

Se você concorda ou não com a decisão do projeto de servir suas macros pré-compiladas, é uma boa prática inspecionar rotineiramente qualquer código fonte e binários de software antes de incorporá-los aos seus projetos.

Publicidade

Aprenda hacking e pentest na prática com esse curso gratuito

Passe por todas as principais fases de um pentest, utilizando cenários, domínios e técnicas reais utilizados no dia a dia de um hacker ético. Conte ainda com certificado e suporte, tudo 100% gratuito. Saiba mais...