Bericht über die Entwicklung von FreeBSD für das dritte Quartal 2019

Veröffentlicht Bericht über die Entwicklung des FreeBSD-Projekts von Juli bis September 2019. Zu den Änderungen gehört:

  • Allgemeine und systembezogene Fragen
    • Das Kernteam hat allgemein die Möglichkeit genehmigt, Code, der unter der BSD-Lizenz mit einer zusätzlichen Patentnutzungsvereinbarung geliefert wird, in das System aufzunehmen (BSD+Patent), jedoch muss die Entscheidung zur Einbeziehung jedes einzelnen Komponents unter dieser Lizenz gesondert genehmigt werden;
    • Es fand die erste Sitzung der Arbeitsgruppe statt, die zur Durchführung der Migration der Quelltexte aus dem zentralisierten Subversion-Quelltextverwaltungssystem in das dezentralisierte Git-System gebildet wurde. Die Diskussion über die Sinnhaftigkeit der Migration dauert noch an, und viele Fragen müssen noch geklärt werden (z. B. wie mit contrib/ zu verfahren ist, ob die Hashes im aktuellen Git-Repository neu generiert werden müssen und wie das Testen der Commits am besten umgesetzt werden kann);
    • Von NetBSD portiert Das KCSAN-Werkzeug (Kernel Concurrency Sanitizer), das die Entstehung von Race Conditions zwischen auf verschiedenen CPUs ausgeführten Kernel-Threads aufdeckt;
    • Es wird daran gearbeitet, den in Clang integrierten Assembler (IAS) anstelle des Assemblers aus den GNU Binutils zu verwenden;
    • Die Linuxumgebungsemulationsinfrastruktur (Linuxulator) wurde für die ARM64-Architektur angepasst. Der Systemaufruf "renameat2" wurde implementiert. Das Werkzeug strace wurde überarbeitet, um Probleme bei der Ausführung von Linux-Programmen, die im Linuxulator ausgeführt werden, zu diagnostizieren. Ein Problem mit Abstürzen beim Verlinken von Executables mit neuem glibc wurde gelöst. Die Ports mit Linux-Komponenten für den Linuxulator wurden auf CentOS 7.7 aktualisiert;
    • Im Rahmen des Google Summer of Code haben Studenten erfolgreich sechs Projekte abgeschlossen: Die Implementierung eines einheitlichen (IPv4/IPv6) Ping-Tools wurde vorbereitet, Werkzeuge für das Testen von Firewalls und das Aufspüren von Kernel-Fehlern (Kernel Sanitizer) wurden entwickelt, ein Modul mac_ipacl wurde vorgeschlagen, Code für die Komprimierung des virtuellen Speichers wurde geschrieben und die Trennung des Portbuild-Prozesses von der lokalen Installation wurde umgesetzt;
    • Das Projekt zur Fuzzing-Testung des FreeBSD-Kernels mit dem System wird weiterentwickelt syzkaller. Im Berichtszeitraum wurden mit Hilfe von syzkaller über zehn Fehler entdeckt und behoben. Ein separater Server wurde für den Betrieb von syzkaller in Virtual Machines auf der Basis von bhyve bereitgestellt, und mit Hilfe von
      Die Überprüfung verschiedener FreeBSD-Subsysteme durch syzbot in der Google-Infrastruktur wurde eingerichtet. Informationen über alle Abstürze werden an den Dienst backtrace.io übertragen, um deren Gruppierung und Analyse zu erleichtern;
    • Es wird an der Aktualisierung der zlib-Implementierung auf Kernel-Ebene gearbeitet.
      Der mit der Kompression verbundene Code wurde von zlib 1.0.4, das vor über 20 Jahren veröffentlicht wurde, auf die aktuelle Codebasis zlib 1.2.11 portiert. Um den Zugang zu zlib zu vereinheitlichen, wurden im Kernel die Funktionen compress, compress2 und uncompress hinzugefügt. Der Protokoll-PPP-Code aus dem netgraph-Subsystem wurde auf die systemeigene zlib-Implementierung umgestellt, anstelle der eigenen Version dieser Bibliothek. Auch die Subsysteme kern_ctf.c, opencryptodeflate, geom_uzip, subr_compressor,
      if_mxge, bxe updated und ng_deflate wurden auf die neue zlib portiert;
    • Es wird eine neue Kernel-Schnittstelle entwickelt sysctlinfo, die es ermöglicht, Elemente in der sysctl-Parameterdatenbank zu finden, die in Form einer MIB (Management Information Base) verarbeitet wird, und Informationen über Objekte an den Benutzerraum zu übermitteln.
  • Sicherheit
    • Ein Kernel-Modul wurde entwickelt mac_ipacl, basierend auf dem TrustedBSD MAC Framework und das ein Zugangskontrollsystem für die Einstellungen des Netzwerkstacks für Jail-Umgebungen implementiert. Zum Beispiel kann der Administrator des Host-Systems mit mac_ipacl dem Benutzer root in einer Jail-Umgebung das Ändern oder Setzen von IP-Adressen oder Subnetzparametern für bestimmte Netzwerkinterfaces untersagen. Das vorgeschlagene System der mandatorischen Zugangskontrolle das Öffnen eines Links in einem neuen Tab oder in einem neuen Container. erlaubt das Festlegen von Listen von IP-Adressen und Subnetzen, die für Jokern zulässig sind, das Verhindern von bestimmten IP- und Adresszuweisungen in Jails oder die Einschränkung der Änderung von Parametern nur auf bestimmte Netzwerkinterfaces;
    • Die Firma Intel hat dem Projekt den Port des Software-Stacks TPM 2.0 übergeben. (Trusted Platform Module) zur Interaktion mit dem Chip für sichere Berechnungen, der üblicherweise für die verifiziertes Laden von Firmware und Betriebssystembootloadern verwendet wird. Die Komponenten des Stacks sind in Form der Ports security/tpm2-tss, security/tpm2-tools und security/tpm2-abrmd dargestellt. Der Port tpm2-tss umfasst Bibliotheken zur Nutzung der TPM2-API, tpm2-tools bietet Kommandozeilen-Utilities zur Durchführung von Operationen mit TPM, und tpm2-abrmd enthält einen Hintergrundprozess mit der Implementierung der Komponenten TPM Access Broker und Resource Manager, die Anfragen von verschiedenen TPM-Nutzern an ein einzelnes Gerät multiplexieren. Neben dem verifizierten Laden kann TPM unter FreeBSD auch zur Verbesserung der Sicherheit von Strongswan IPsec, SSH und TLS verwendet werden, indem kryptografische Operationen auf einem separaten Chip durchgeführt werden;
    • Der Kernel für die Architektur amd64 ist für das Laden mittels der W^X-Technik (write XOR execute) angepasst, die besagt, dass Speicherseiten nicht gleichzeitig schreib- und ausführbar sein dürfen (der Kernel kann jetzt unter Verwendung von ausführbaren Speicherseiten geladen werden, bei denen das Schreiben verboten ist). Die neue Schutzmethode für den Kernel ist in den HEAD-Zweig integriert und wird in die Versionen FreeBSD 13.0 und 12.2 aufgenommen;
    • Für die Systemaufrufe mmap und mprotect wurde implementiert Makro PROT_MAX(), das es ermöglicht, das zulässige Set von Zugriffsberechtigungsflags bei späteren Änderungen zu bestimmen (PROT_READ, PROT_WRITE, PROT_EXEC). Mit PROT_MAX() kann der Entwickler den Übergang eines Speicherbereichs in die ausführbare Kategorie verweigern oder Speicher anfordern, der nicht ausführbar ist, aber später in ausführbare Bereiche umgewandelt werden kann. Beispielsweise kann ein Speicherbereich nur während des dynamischen Bindens oder der JIT-Code-Generierung zum Schreiben geöffnet werden, sollte jedoch nach Abschluss des Schreibens auf Lesen und Ausführen beschränkt sein, sodass in Zukunft, im Falle eines Kompromisses, ein Angreifer das Schreiben für diesen Speicherblock nicht mehr erlauben kann. Zusätzlich zu PROT_MAX() ist auch sysctl vm.imply_prot_max implementiert, dessen Aktivierung das zulässige Set von Flags basierend auf den ursprünglichen Parametern des ersten mmap-Aufrufs bestimmt;
    • Zur Verstärkung des Schutzes vor der Ausnutzung von Sicherheitsanfälligkeiten wurde neben der Technik zur Randomisierung des Adressraums (ASLR) ein Mechanismus zur Randomisierung von Offsets von Zeigern vorgeschlagen, die auf den Anfangsrahmen des Stacks sowie auf im Stack abgelegte Strukturen mit Informationen zur Umgebung, zu Programmstartparametern und zu Daten für ausführbare Images im ELF-Format verweisen;
    • Es wurde daran gearbeitet, die unsichere Funktion gets aus libc zu entfernen (seit der C11-Norm ist diese Funktion aus der Spezifikation ausgeschlossen) und die Anwendungsports, die diese Funktion noch verwenden, zu berichtigen. Die Änderung ist für FreeBSD 13.0 vorgesehen;
    • Ein experimentelles Projekt zur Erstellung von Orchestrierungswerkzeugen für Jail-Umgebungen auf Basis eines Frameworks wurde gestartet, pot um Images zu erstellen und zu exportieren, das ähnlich wie Docker implementiert wurde, sowie einen Treiber nomad, der eine Schnittstelle für die dynamische Ausführung von Anwendungen in einer Jail-Umgebung bereitstellt. Das vorgeschlagene Modell ermöglicht es, die Prozesse zur Erstellung von Jail-Umgebungen und deren Bereitstellung zu trennen. Eines der Ziele des Projekts ist es, ein Mittel zur Manipulation von Jails als Container im Docker-Stil bereitzustellen;
  • Speichersysteme und Dateisysteme
    • Von NetBSD in das Dienstprogramm „makefs“ wurde die Unterstützung für das FAT-Dateisystem (msdosfs) übertragen. Die vorbereiteten Änderungen ermöglichen die Erstellung von FAT-Dateisystem-Images ohne Verwendung des md-Treibers und ohne Root-Rechte;
    • Die Überarbeitung des Treibers des FUSE-Subsystems (File System in USErspace), das die Implementierung von Dateisystemen im Benutzermodus ermöglicht, wurde abgeschlossen. Der ursprünglich gelieferte Treiber wies viele Fehler auf und basierte auf der Version FUSE 7.8, die vor 11 Jahren veröffentlicht wurde. Im Rahmen des Projekts zur Modernisierung des Treibers wurde die Unterstützung für das FUSE-Protokoll 7.23 implementiert, Code zur Überprüfung der Zugriffsrechte auf der Kernel-Seite („-o default_permissions“) hinzugefügt, die Aufrufe VOP_MKNOD, VOP_BMAP und VOP_ADVLOCK integriert, die Möglichkeit zur Unterbrechung von FUSE-Operationen bereitgestellt, Unterstützung für benannte Pipes und Unix-Sockets in fusefs hinzugefügt, die Verwendung von kqueue für /dev/fuse ermöglicht, die Aktualisierung der Einhängeparameter über „mount -u“ erlaubt, die Unterstützung für den Export von fusefs über NFS implementiert, RLIMIT_FSIZE berücksichtigt, die Flags FOPEN_KEEP_CACHE und FUSE_ASYNC_READ hinzugefügt, erhebliche Leistungsoptimierungen durchgeführt und die Cache-Organisation verbessert. Der neue Treiber wurde in die Branches head und stable/12 aufgenommen (er wurde Teil von FreeBSD 12.1);
    • Die Implementierung von NFSv4.2 (RFC-7862) für FreeBSD ist nahezu abgeschlossen. Im Berichtszeitraum lag der Schwerpunkt auf Tests. Die Tests zur Überprüfung der Kompatibilität mit der Implementierung aus Linux wurden abgeschlossen, aber die Überprüfung der Funktionsweise des pNFS-Servers mit NFSv4.2 dauert noch an. Der Code wird bereits allgemein als bereit für die Integration in die Branches FreeBSD head/current betrachtet.
  • Hardwareunterstützung
    • Ein Projekt zur Verbesserung der Funktionalität von FreeBSD auf Notebooks wurde gestartet. Das erste Gerät, für das eine Überprüfung der Hardwareunterstützung in FreeBSD durchgeführt wurde, war das Lenovo X1 Carbon der siebten Generation.
    • CheriBSD, ein Fork von FreeBSD für architektonische Forschungszwecke. CHERI (Capability Hardware Enhanced RISC Instructions), aktualisiert, um den kommenden ARM Morello-Prozessor zu unterstützen, der ein CHERI-basiertes Gedächtnisschutzsystem mit einer Capsicum-Schutzmodellansatz unterstützt. Der Morello-Chip planen soll 2021 veröffentlicht werden. Die Entwickler von CheriBSD verfolgen auch die Entwicklung eines Referenzprototyps von CHERI auf MIPS-Architektur.
    • Die Unterstützung für RockChip RK3399-Chips, die auf RockPro64- und NanoPC-T4-Boards verwendet werden, wurde erweitert. Die bedeutendste Verbesserung war die Unterstützung von eMMC und die Entwicklung eines neuen Treibers für den auf dem Board verwendeten eMMC-Controller.
    • Die Arbeit zur Unterstützung des ARM64 SoC Broadcom BCM5871X mit ARMv8 Cortex-A57-Prozessoren, die für Router, Gateways und Netzwerkspeicherlösungen gedacht sind, wurde fortgesetzt. Im Berichtszeitraum
      wurde die Unterstützung für iProc PCIe ausgebaut und die Möglichkeit zur Nutzung hardwarebasierter kryptografischer Operationen zur Beschleunigung von IPsec hinzugefügt.
      Die Integration des Codes in den HEAD-Branch wird im vierten Quartal erwartet.
    • Es wurden erhebliche Fortschritte bei der Entwicklung des FreeBSD-Ports für die Plattform powerpc64 erzielt. Der Schwerpunkt liegt auf der Sicherstellung einer qualitativ hochwertigen Leistung auf Systemen mit IBM POWER8- und POWER9-Prozessoren, aber es wird optional auch die Unterstützung auf alten Apple Power Mac-, x500- und Amiga A1222-Systemen unterstützt. Der Branch powerpc*/12 wird weiterhin mit gcc 4.2.1 ausgeliefert, während der Branch powerpc*/13 bald auf llvm90 umgestellt wird. Von 33306 Ports können 30514 erfolgreich gebaut werden.
    • Die Portierung von FreeBSD für den 64-Bit-SoC NXP LS1046A mit dem ARMv8 Cortex-A72-Prozessor und einem integrierten Netzwerkpaketbeschleuniger, 10 Gb Ethernet, PCIe 3.0, SATA 3.0 und USB 3.0 wurde fortgesetzt. Im Berichtszeitraum wurde die Unterstützung für USB 3.0, SD/MMC, I2C, die DPAA-Netzwerkschnittstelle und GPIO implementiert. Geplant ist die Unterstützung von QSPI und die Durchführung von Leistungsoptimierungen der Netzwerkschnittstelle. Der Abschluss der Arbeiten und die Einbeziehung in den HEAD-Zweig wird im vierten Quartal 2019 erwartet.
    • Der Treiber ena wurde mit Unterstützung für die zweite Generation der ENAv2 (Elastic Network Adapter) Netzwerkadapter aktualisiert, die in der Elastic Compute Cloud (EC2) Infrastruktur zur Verbindung von EC2-Knoten mit Geschwindigkeiten von bis zu 25 Gb/s verwendet werden. Im Treiber ena wurde die Unterstützung für NETMAP hinzugefügt und getestet, ebenso wie die Anpassung des Speicherrasters zur Aktivierung des LLQ-Modus in Amazon EC2 A1-Umgebungen.
  • Anwendungen und Ports-System
    • Die Komponenten des Grafikstacks und die mit xorg verbundenen Ports wurden aktualisiert. Ports, die USE_XORG und XORG_CAT verwenden, wurden auf das USES-Framework umgestellt, anstatt bsd.xorg.mk über bsd.port.mk aufzurufen. Solche Ports beinhalten jetzt das Flag „USES=xorg“ in Makefiles. Die Funktionalität von XORG_CAT wurde aus bsd.xorg.mk herausgelöst und wird nun mit dem Flag „USES=xorg-cat“ aktiviert. Ein Werkzeug zum direkten Erstellen von xorg-Ports aus dem git-Repository wurde hinzugefügt.
      freedesktop.org, was es beispielsweise ermöglicht, Ports für noch nicht veröffentlichte Versionen zu erstellen. In Zukunft wird ein Werkzeug vorbereitet, um das Build-System meson anstelle von autotools für den Bau von xorg-Ports zu verwenden.

      Es wurde an der Bereinigung alter xorg-Ports gearbeitet, die mit bereits nicht mehr unterstützten Komponenten verbunden sind, z. B. wurde der Port x11/libXp entfernt, während die Ports x11/Xxf86misc, x11-fonts/libXfontcache und graphics/libGLw als veraltet klassifiziert wurden.

    • Es wurden Verbesserungen an der Unterstützung von Java 11 und neueren Versionen in FreeBSD sowie am Portieren einiger Änderungen in den Java 8-Zweig durchgeführt. Nachdem die Unterstützung für neue Funktionen von Java 11 wie Java Flight Recorder, HotSpot Serviceability Agent, HotSpot Debugger, DTrace, Javac Server, Java Sound und SCTP in FreeBSD implementiert wurde, wurde der Fokus auf die Sicherstellung der Kompatibilität aller Tests gelenkt. Die Anzahl der Testfehler wurde von 50 auf 2 reduziert.
    • Der KDE Plasma-Desktop, die KDE Frameworks, die KDE Anwendungen und Qt wurden auf dem neuesten Stand gehalten und auf die aktuellsten Versionen aktualisiert.
    • Die Ports mit dem Xfce-Desktop wurden auf die neueste Version aktualisiert. 4.14;
    • Der Portsbaum von FreeBSD hat die Grenze von 38.000 Ports überschritten, die Anzahl der offenen PRs liegt leicht über 2.000, von denen 400 PRs noch nicht bearbeitet sind. Im Berichtszeitraum wurden 7.340 Änderungen von 169 Entwicklern eingebracht. Zwei neue Mitglieder (Santhosh Raju und Dmitri Goutnik) haben die Commit-Rechte erhalten. Eine neue Version des Paketmanagers pkg 1.12 wurde veröffentlicht, die Overlay-Unterstützung im Portsbaum und eine Bereinigung von bsd.sites.mk beinhaltet. Zu den bedeutenden Versionsupdates in den Ports gehören: 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;
    • Die Entwicklung des Projekts ClonOS, entwickelnd ist eine spezialisierte Distribution zur Bereitstellung von Infrastruktur für virtuelle Server. In Bezug auf die zu lösenden Aufgaben ähnelt ClonOS Systemen wie Proxmox, Triton (Joyent), OpenStack, OpenNebula und Amazon AWS, wobei der Hauptunterschied die Verwendung von FreeBSD und die Möglichkeit zur Verwaltung, Bereitstellung und Verwaltung von Jail-Containern unter FreeBSD sowie virtuellen Umgebungen auf Basis der Hypervisoren Bhyve und Xen ist. Zu den jüngsten Änderungen gehört die Unterstützung
      von cloud-init für Linux/BSD-VMs und cloudbase-init für Windows-VMs, der Beginn der Umstellung auf die Verwendung eigener Images, die Integration von Jenkins CI zur Testung von Builds und ein neues pkg-Repository zur Installation von
      ClonOS aus Paketen.

Quelle: opennet.ru

60GB SSD 8Gb DDR4