Mais de 10% dos pacotes Python no PyPI são distribuídos sem licença
Tal Einat
18 de setembro de 2018
0 minutos de leituraImagine que você instalou um pacote Python aleatório do PyPI. Há uma boa chance — 13,5% — de que o pacote não tenha informações de licença. Como não é incomum uma aplicação Python típica ter centenas de dependências e dependências indiretas, é bastante provável que você esteja usando código sem licença. Dependendo do contexto, as consequências do uso de software sem licença podem ir de insignificantes a desastrosas. É uma variação e tanto; por isso, vamos analisar esse problema mais a fundo neste post.
O que é o PyPI?
O PyPI é o repositório central de pacotes Python mais usado. Ele foi criado e é mantido pela Python Software Foundation. Em geral, é acessado por ferramentas de gerenciamento de pacotes, como o pip, para baixar e instalar bibliotecas e aplicativos Python. O funcionamento é semelhante ao de repositórios de pacotes de outras linguagens, como o npm para JavaScript, o RubyGems.org para Ruby e o crates.io para Rust.
Contexto
A Snyk analisa as dependências de projetos de software e identifica problemas como vulnerabilidades de segurança e licenças inadequadas. Para isso, a empresa me contratou recentemente para coletar do PyPI todos os metadados sobre os pacotes e suas versões lançadas, incluindo as informações de licença. Com esses dados em mãos, analisei a situação das licenças de todos os pacotes Python no PyPI.
A seguir, você encontra algumas das principais conclusões dessa análise, sugestões com base nelas e uma descrição dos métodos usados para chegar a esses resultados.
Como são as licenças no ecossistema Python?
Antes de mais nada, um aviso rápido: não sou advogado. Sou engenheiro de software experiente e entendo um pouco de licenciamento de software, mas não sou especialista na área. Nada do que vem a seguir deve ser considerado aconselhamento jurídico. Se precisar, consulte um advogado!
Tipos de licença
De modo geral, quase todas as licenças de software de código aberto podem ser divididas em algumas categorias amplas:
As licenças “copyleft” são relativamente restritivas e incluem a conhecida licença GPL, suas muitas variações e licenças semelhantes. Elas permitem que o software seja usado para praticamente qualquer finalidade, mas exigem que todas as modificações feitas também sejam disponibilizadas publicamente. Além disso, algumas licenças copyleft mais “fortes” exigem, em certas circunstâncias, que o código que usa o software licenciado dessa forma também seja disponibilizado publicamente.
Por outro lado, as licenças “permissivas” permitem modificar o software sem precisar tornar públicas essas modificações. Em geral, também são muito mais simples e impõem menos restrições.
No extremo oposto estão as licenças de “domínio público”, que geralmente não impõem nenhuma restrição de uso.
Para saber mais sobre licenças copyleft e permissivas, confira um post anterior sobre o assunto no nosso blog.
Nos últimos anos, surgiram várias licenças de “copyleft fraco”. Elas são destinadas principalmente a bibliotecas de software e permitem seu uso com menos restrições, ou nenhuma, para o software que as utiliza. Para saber mais sobre a diferença entre copyleft “fraco” e “forte”, consulte a seção sobre o tema no artigo da Wikipédia.
Também é possível, embora não seja recomendável, não especificar uma licença. Na maioria das vezes, isso acontece por descuido ou falta de conhecimento, mas, em alguns casos raros, é intencional. Sem uma licença, o uso do software fica sujeito à legislação de direitos autorais (de cada país!) e também a outros tipos de legislação, como a de patentes.
Distribuição por tipo de licença
Vamos conferir os tipos de licença usados no PyPI:

Com esses dados, podemos observar o seguinte:
A maioria dos pacotes do PyPI, 64%, usa uma licença “permissiva”, como a MIT, a Apache 2.0 e as licenças BSD de 2 ou 3 cláusulas.
18,5% usam uma licença de “copyleft forte”, como as licenças GPL e AGPL.
3% usam uma licença de “copyleft fraco”, como as licenças LGPL e MPL.
Apenas 1% usa uma licença de “domínio público”, como as licenças CC0, WTFPL e Unlicense.
13,5% não incluem nenhuma licença.
Isso não surpreende, pois é semelhante às tendências gerais observadas no GitHub e nos repositórios de pacotes de outras linguagens.
Licenças mais comuns para pacotes Python
Quatro licenças predominam no PyPI: MIT, BSD-2-Clause, GPL-3.0 e Apache-2.0.

Muitas outras licenças também são usadas com frequência (por pelo menos 100 pacotes). Duas delas são exclusivas do ecossistema Python: a licença Python Software Foundation (PSF) e a Zope Public License (ZPL).

O que você deve fazer AGORA!
Considerando o licenciamento dos pacotes Python no PyPI, recomendo fortemente que você:
Verifique se você usa, direta ou indiretamente, software com licenças “copyleft” e se está confortável com as implicações para o seu código.
Se você escreve código proprietário (não aberto), isso pode representar um sério risco jurídico, especialmente no caso das licenças de “copyleft forte”, usadas por mais de 18% dos pacotes do PyPI.
Se você desenvolve software de código aberto, essas licenças podem obrigar você a licenciar seu código em termos semelhantes.
Verifique se alguma das suas dependências não tem licença.
Se você precisar modificar uma dependência assim, agora ou no futuro, talvez não possa fazê-lo de acordo com a legislação de direitos autorais.
É provável que versões futuras dessas dependências incluam uma licença, mas não dá para saber que tipo de licença será adotado.
Configure uma ferramenta automatizada para verificar periodicamente ou continuamente as licenças das suas dependências.
Ao longo da vida útil de um projeto, é comum adicionar e alterar dependências.
As dependências podem mudar de licença entre versões. Portanto, atualizar uma versão pode alterar os termos de licenciamento.
Para saber mais
Este post é apenas o começo: o licenciamento pode ser mais importante do que você imagina, e vale a pena se aprofundar no assunto. Considere pesquisar sobre:
Licenciamento múltiplo (cerca de 500 pacotes no PyPI têm mais de uma licença)
O lado jurídico do código aberto, especialmente a seção sobre como escolher uma licença para seu software.
Metodologia
Veja alguns detalhes sobre como os dados foram coletados e analisados.
Primeiro, coletei os metadados de todos os pacotes do PyPI e de todas as versões lançadas. Fiz isso ao longo de vários dias no início de agosto de 2018. Na época, havia quase 150 mil pacotes no PyPI.
Em seguida, extraí as informações de licença de cada versão de cada pacote, tanto dos campos “license” quanto dos “classifiers”. Depois, reuni os dados em uma única estrutura, com as versões ordenadas de acordo com uma interpretação no estilo do versionamento semântico.
Depois, limpei e normalizei os dados de licenciamento. Usei como base uma versão de um normalizador de licenças SPDX usado na Snyk. Aprimorei o normalizador iterativamente para reconhecer corretamente mais licenças e, em seguida, criei manualmente um amplo mapeamento de casos especiais para lidar com os muitos casos excepcionais.
Depois disso, comecei a analisar os 18% de pacotes sem licença. Até então, ainda não havia examinado os arquivos das próprias versões lançadas. Selecionei aleatoriamente 50 pacotes sem licença, baixei as versões mais recentes e procurei informações de licenciamento. Depois de coletar esses dados, classifiquei os pacotes em cinco categorias:

Somente os pacotes da categoria “Licensed” de fato têm uma licença. Entre os das categorias “training”, “throwaway” e “placeholder”, a grande maioria incluía algum código e poderia ser usada como dependência, intencionalmente ou por engano (por exemplo, devido a um erro de digitação). Por isso, considerei razoável classificá-los como pacotes sem licença propriamente ditos. Extrapolando os resultados dessa amostra, estimei que ~18% × 72% = ~13,5% dos pacotes do PyPI não têm licença.
Vale observar que não fiz uma análise semelhante dos pacotes licenciados no PyPI. É provável que existam muitos pacotes das categorias “training”, “throwaway” e “placeholder” que mencionem uma licença. Portanto, adotar uma postura conservadora e considerar que apenas ~18% × 28% = ~5% dos pacotes “reais” do PyPI não têm licença provavelmente levaria a uma estimativa muito imprecisa. Infelizmente, não tive tempo de fazer essa análise, então me limitei à análise descrita acima.
Se você tiver alguma dúvida ou comentário, adoraria saber! Entre em contato comigo pelo Twitter, em @taleinat.
Comece a resolver desafios de capture the flag
Aprenda a resolver desafios de capture the flag assistindo sob demanda ao nosso workshop virtual introdutório.
