Relatório sobre o desenvolvimento do projeto FreeBSD de julho a setembro de 2019. Entre as mudanças, destacam-se:
- Questões gerais e sistêmicas
- A equipe principal aprovou, de forma geral, a possibilidade de inclusão no sistema de código fornecido sob a licença BSD com um acordo adicional sobre o uso de patentes (), mas a decisão sobre a inclusão de cada componente sob essa licença deve ser aprovada separadamente;
- Realizou-se a primeira reunião do grupo de trabalho criado para realizar a migração dos textos fonte do sistema centralizado de controle de versões Subversion para o sistema descentralizado Git. A discussão sobre a viabilidade da migração ainda continua e muitas questões ainda precisam ser resolvidas (por exemplo, como proceder com contrib/, se é necessário regenerar os hashes no repositório git atual e como realizar da melhor forma o teste dos commits);
- Do NetBSD o conjunto de ferramentas KCSAN (Kernel Concurrency Sanitizer), que permite identificar a ocorrência de estados de corrida entre threads do núcleo executados em diferentes CPUs;
- Estão em andamento trabalhos para usar o assembler embutido no Clang (IAS) em vez do assembler do GNU binutils;
- A infraestrutura de emulação do ambiente Linux (Linuxulator) foi adaptada para funcionar na arquitetura ARM64. A chamada de sistema "renameat2" foi implementada. A ferramenta strace foi aprimorada para diagnosticar problemas em arquivos executáveis do Linux executados no Linuxulator. Um problema com falhas ao vincular arquivos executáveis com glibc recente foi resolvido. Os ports com componentes Linux para o Linuxulator foram atualizados para CentOS 7.7;
- No âmbito do programa Google Summer of Code, seis projetos foram concluídos com sucesso por estudantes: foi preparada a implementação de uma ferramenta unificada (IPv4/IPv6) para ping, desenvolvidos conjuntos de ferramentas para testar firewalls e identificar erros no núcleo (Kernel sanitizer), foi proposto um módulo mac_ipacl, foi escrito código para compactação de memória virtual e foi realizado trabalho para separar o processo de construção de ports da instalação local;
- Continua a evolução do projeto de testes de fuzzing do núcleo FreeBSD utilizando o sistema . Durante o período do relatório, mais de dez erros foram identificados e corrigidos com a ajuda do syzkaller. Um servidor dedicado foi configurado para executar o syzkaller em máquinas virtuais baseadas em bhyve, e com a ajuda de
O syzbot estabeleceu a verificação de vários subsistemas FreeBSD na infraestrutura do Google. Foi organizado o envio de informações sobre todas as falhas para o serviço backtrace.io, facilitando sua agrupamento e análise; - Está em andamento a atualização da implementação do zlib a nível de núcleo.
O código relacionado à compressão foi transferido do zlib 1.0.4, lançado há mais de 20 anos, para a base de código atual do zlib 1.2.11. Para unificar o acesso ao zlib, funções como compress, compress2 e uncompress foram adicionadas ao núcleo. O código que suporta o protocolo PPP do subsistema netgraph foi atualizado para usar a implementação do zlib do sistema, em vez de sua própria versão da biblioteca. Também foram atualizados para o novo zlib os subsistemas kern_ctf.c, opencryptodeflate, geom_uzip e subr_compressor,
if_mxge, bxe atualizado e ng_deflate; - Um novo interface do núcleo está sendo desenvolvido , permitindo encontrar elementos na base de parâmetros sysctl, processados na forma MIB (Management Information Base), e transmitir informações sobre objetos para o espaço do usuário.
- Segurança
- Um módulo do núcleo foi desenvolvido , baseado no TrustedBSD MAC Framework e implementando um sistema de controle de acesso às configurações da pilha de rede para ambientes de jail. Por exemplo, usando o mac_ipacl, o administrador do sistema host pode proibir o usuário root em um ambiente jail de alterar ou definir endereços IP ou parâmetros de sub-redes para determinadas interfaces de rede. O sistema proposto de controle de acesso mandatório permite definir listas de endereços IP e sub-redes permitidos para a Jail, proibir a definição de determinados IPs e sub-redes na Jail ou restringir a alteração de parâmetros apenas para determinadas interfaces de rede;
- A Intel transferiu para o projeto a porta da pilha de software (Trusted Platform Module) para a interação com o chip de computação segura, geralmente utilizado para a inicialização verificada de firmware e do carregador de sistema operacional. Os componentes da pilha são apresentados na forma de portas security/tpm2-tss, security/tpm2-tools e security/tpm2-abrmd. A porta tpm2-tss inclui bibliotecas para uso da API TPM2, tpm2-tools fornece utilitários de linha de comando para executar operações com o TPM, enquanto tpm2-abrmd contém um processo em segundo plano que implementa os componentes TPM Access Broker e Resource Manager, multiplexando solicitações de diferentes usuários do TPM para um único dispositivo. Além da inicialização verificada, no FreeBSD o TPM pode ser utilizado para aumentar a segurança do Strongswan IPsec, SSH e TLS por meio da execução de operações criptográficas em um chip separado;
- O núcleo para a arquitetura amd64 foi adaptado para inicialização utilizando a técnica de proteção W^X (write XOR execute), que implica que as páginas de memória não podem ser acessadas para escrita e execução ao mesmo tempo (o núcleo agora pode ser carregado utilizando páginas de memória executáveis nas quais a escrita é proibida). O novo método de proteção do núcleo está incluído na ramificação HEAD e fará parte das versões FreeBSD 13.0 e 12.2;
- Para chamadas de sistema mmap e mprotect o macro PROT_MAX(), que permite determinar o conjunto de flags de restrição de acesso (PROT_READ, PROT_WRITE, PROT_EXEC) permitido para mudanças futuras. Com o PROT_MAX(), o desenvolvedor pode proibir a transição de uma área de memória para a categoria executável ou solicitar memória que não permita execução, mas que pode ser convertida em executável posteriormente. Por exemplo, uma área de memória pode ser aberta para escrita apenas durante o tempo de vinculação dinâmica ou geração de código JIT, mas após a conclusão da gravação, limitada apenas para leitura e execução, e no futuro, em caso de comprometimento, um invasor não conseguirá permitir gravação para aquele bloco de memória. Além do PROT_MAX(), também foi implementado o sysctl vm.imply_prot_max, cuja ativação determina o conjunto de flags permitidos com base nos parâmetros iniciais da primeira chamada mmap;
- Para aumentar a proteção contra a exploração de vulnerabilidades, além da técnica de randomização de espaço de endereçamento (ASLR), foi proposto um mecanismo de randomização de deslocamentos de ponteiros que endereçam o quadro inicial da pilha e estruturas colocadas na pilha contendo informações sobre o ambiente, parâmetros de inicialização do programa e dados para imagens executáveis no formato ELF;
- Foi realizado um trabalho para remover a função não segura gets da libc (a partir da norma C11, essa função foi excluída da especificação) e corrigir as portas que ainda utilizam essa função. A alteração está prevista para ser proposta no FreeBSD 13.0;
- Foi iniciado um projeto experimental para criar ferramentas de orquestração de ambientes jail com base em um framework para a criação e exportação de imagens, implementado de forma semelhante ao Docker, e um driver , que fornece uma interface para o lançamento dinâmico de aplicativos em um ambiente jail. O modelo proposto permite separar os processos de criação de ambientes jail e o deploy neles de aplicativos. Um dos objetivos do projeto é fornecer uma ferramenta para manipular jails como contêineres no estilo Docker;
- Sistemas de armazenamento e sistemas de arquivos
- Do NetBSD, na utilidade "makefs" suporte ao sistema de arquivos FAT (msdosfs). As alterações preparadas permitem a criação de imagens de FS com FAT sem a utilização do driver md e sem privilégios de root;
- Finalizou-se a reestruturação do driver do subsistema FUSE (File system in USErspace), que permite a criação de implementações de sistemas de arquivos no espaço do usuário. O driver originalmente fornecido continha muitos erros e era baseado na versão FUSE 7.8, lançada há 11 anos. No âmbito do projeto de modernização do driver, foi implementado suporte ao protocolo FUSE 7.23, adicionado código para verificação de permissões do lado do kernel (“-o default_permissions”), feitas chamadas VOP_MKNOD, VOP_BMAP e VOP_ADVLOCK, possibilitada a interrupção de operações FUSE, adicionado suporte a pipes nomeados e sockets unix em fusefs, implementado o uso de kqueue para /dev/fuse, permitido a atualização de parâmetros de montagem via “mount -u”, adicionado suporte à exportação de fusefs via NFS, implementada a contagem de RLIMIT_FSIZE, adicionados os flags FOPEN_KEEP_CACHE e FUSE_ASYNC_READ, feitas significativas otimizações de desempenho e melhorada a organização da cache. O novo driver foi incluído nas branches head e stable/12 (faz parte do FreeBSD 12.1);
- O trabalho para implementar o NFSv4.2 (RFC-7862) para FreeBSD está quase concluído. Durante o período reportado, o foco principal foi nos testes. Os testes de compatibilidade com a implementação do Linux foram concluídos, mas a verificação do funcionamento do servidor pNFS com NFSv4.2 ainda está em andamento. De forma geral, o código já é considerado pronto para integração nos ramos FreeBSD head/current. A nova versão do NFS adicionou suporte às funções posix_fadvise, posix_fallocate, modos SEEKHOLE/SEEKDATA no lseek e operações de cópia local de partes do arquivo no servidor (sem a transferência para o cliente);
- Suporte a hardware
- Foi iniciado um projeto para melhorar o desempenho do FreeBSD em laptops. O primeiro dispositivo para o qual uma auditoria de suporte de hardware foi realizada no FreeBSD foi o laptop Lenovo X1 Carbon de sétima geração;
- CheriBSD, um fork do FreeBSD para uma arquitetura de processador de pesquisa Instruições de RISC Aprimoradas por Capacidade (Capability Hardware Enhanced RISC Instructions), atualizado para suportar o futuro processador ARM Morello, que irá suportar o sistema de gerenciamento de acesso à memória CHERI, baseado no modelo de proteção do projeto Capsicum. O chip Morello será lançado em 2021. Os desenvolvedores do CheriBSD também continuam acompanhando o desenvolvimento do protótipo de referência CHERI baseado na arquitetura MIPS;
- O suporte para chips RockChip RK3399, utilizados nas placas RockPro64 e NanoPC-T4, foi ampliado. A melhoria mais significativa foi o suporte ao eMMC e o desenvolvimento de um novo driver para o controlador de eMMC utilizado na placa;
- O trabalho na implementação do suporte ao ARM64 SoC Broadcom BCM5871X com processadores ARMv8 Cortex-A57, voltados para uso em roteadores, gateways e armazenamento em rede, foi continuado. Durante o período reportado,
o suporte ao iProc PCIe foi ampliado e a possibilidade de usar operações criptográficas de hardware para acelerar o funcionamento do IPsec foi adicionada.
A integração do código na branch HEAD é esperada para o quarto trimestre; - Conquistas significativas são observadas no desenvolvimento do porta FreeBSD para a plataforma powerpc64. O foco principal é garantir um funcionamento de qualidade em sistemas com processadores IBM POWER8 e POWER9, mas a operação em antigos Apple Power Mac, x500 e Amiga A1222 também é suportada opcionalmente. A branch powerpc*/12 continua a ser fornecida com gcc 4.2.1, e a branch powerpc*/13 será em breve migrada para llvm90. De 33,306 ports, 30,514 foram compilados com sucesso;
- Continua o porting do FreeBSD para o SoC NXP LS1046A de 64 bits, baseado no processador ARMv8 Cortex-A72, com um motor integrado de aceleração de processamento de pacotes de rede, 10 Gb Ethernet, PCIe 3.0, SATA 3.0 e USB 3.0. No período reportado, foi implementado o suporte a USB 3.0, SD/MMC, I2C, interface de rede DPAA e GPIO. Está previsto o suporte a QSPI e a otimização de desempenho da interface de rede. A conclusão do trabalho e a inclusão na branch HEAD são esperadas para o quarto trimestre de 2019.
- O driver ena foi atualizado com suporte à segunda geração de adaptadores de rede ENAv2 (Elastic Network Adapter), usados na infraestrutura Elastic Compute Cloud (EC2) para estabelecer comunicação entre nós EC2 a velocidades de até 25 Gb/s. O driver ena recebeu e testou suporte ao NETMAP, além da adaptação do layout de memória para incluir o modo LLQ em ambientes Amazon EC2 A1.
- Aplicativos e sistema de ports
- Os componentes da pilha gráfica e os ports relacionados ao xorg foram atualizados. Os ports que utilizam USE_XORG e XORG_CAT foram migrados para o framework USES em vez de chamar bsd.xorg.mk através de bsd.port.mk. Esses ports agora incluem a flag "USES=xorg" nos Makefiles. A funcionalidade XORG_CAT foi separada de bsd.xorg.mk e agora é ativada pela flag "USES=xorg-cat". Ferramentas foram adicionadas para a criação direta de ports xorg a partir do repositório git.
freedesktop.org, o que, por exemplo, permite a criação de ports para versões ainda não lançadas. No futuro, está previsto preparar ferramentas para utilizar o sistema de construção meson em vez do autotools para a criação de ports xorg.Foi realizado um trabalho de limpeza dos antigos ports xorg, vinculados a componentes já não suportados, como a remoção do port x11/libXp, e os ports x11/Xxf86misc, x11-fonts/libXfontcache e graphics/libGLw foram classificados como obsoletos.
- Foi realizado um trabalho para melhorar o suporte ao Java 11 e versões mais recentes no FreeBSD, além de portear algumas alterações para a branch do Java 8. Após a implementação do suporte a novas funcionalidades do Java 11, como Java Flight Recorder, HotSpot Serviceability Agent, HotSpot Debugger, DTrace, Javac Server, Java Sound e SCTP, o trabalho se concentrou em garantir que todos os testes de compatibilidade fossem bem-sucedidos. O número de falhas nos testes foi reduzido de 50 para 2.
- O desktop KDE Plasma, KDE Frameworks, KDE Applications e Qt foram mantidos atualizados e atualizados para as versões mais recentes.
- Os ports do desktop Xfce foram atualizados para a versão mais recente. ;
- A árvore de ports do FreeBSD ultrapassou a marca de 38.000 ports, com um número de PRs não fechados um pouco superior a 2.000, dos quais 400 PRs ainda não foram analisados. Durante o período do relatório, 7.340 modificações foram feitas por 169 desenvolvedores. Dois novos membros (Santhosh Raju e Dmitri Goutnik) ganharam direitos de commit. Uma nova versão do gerenciador de pacotes pkg 1.12 foi lançada, com suporte a overlays na árvore de ports e uma limpeza no arquivo bsd.sites.mk. Entre as atualizações significativas nas versões dos ports estão: Lazarus 2.0.4, LLVM 9.0, Perl 5.30, PostgreSQL 11, Ruby 2.6, Firefox 69.0.1, Firefox-esr 68.1.0, Chromium 76.0;
- O desenvolvimento do projeto continua , é uma distribuição especializada para implantação de infraestrutura de servidores virtuais. Em termos de tarefas solucionadas, o ClonOS se assemelha a sistemas como Proxmox, Triton (Joyent), OpenStack, OpenNebula e Amazon AWS, sendo a principal diferença o uso do FreeBSD e a possibilidade de gerenciar, implantar e operar Jail-containers do FreeBSD e ambientes virtuais baseados em hipervisores Bhyve e Xen. Entre as mudanças recentes, destaca-se o suporte
cloud-init para VM Linux/BSD e cloudbase-init para VM Windows, o início da transição para o uso de imagens próprias, a implementação do Jenkins CI para testar builds e um novo repositório pkg para a instalação
do ClonOS a partir dos pacotes.
- Os componentes da pilha gráfica e os ports relacionados ao xorg foram atualizados. Os ports que utilizam USE_XORG e XORG_CAT foram migrados para o framework USES em vez de chamar bsd.xorg.mk através de bsd.port.mk. Esses ports agora incluem a flag "USES=xorg" nos Makefiles. A funcionalidade XORG_CAT foi separada de bsd.xorg.mk e agora é ativada pela flag "USES=xorg-cat". Ferramentas foram adicionadas para a criação direta de ports xorg a partir do repositório git.
Fonte: opennet.ru
