นวัตกรรมของ OpenBSD
(openbsd.org)โครงการ OpenBSD พัฒนาและดูแลรักษาซอฟต์แวร์และแนวคิดที่หลากหลาย ต่อไปนี้คือการสรุปโดยเรียงตามลำดับเวลาการนำมาใช้โดยคร่าว ๆ
แนวคิด (Concepts)
- IPSec(4): OpenBSD เป็นระบบปฏิบัติการแบบ Free รายแรกที่ให้สแตก IPSec นำมาใช้เมื่อ 20 กุมภาพันธ์ 1997
- INET6(4): ผสานรวม IPv6 อย่างสมบูรณ์ใน OpenBSD 2.7 เริ่มพัฒนาเมื่อ 6 มกราคม 1999 และใน hackathon ครั้งแรกของปีเดียวกันเมื่อ 6 มิถุนายน ก็ทำงานได้เกือบสมบูรณ์แล้ว
- การแยกสิทธิ์ (Privilege Separation): ถูกนำไปใช้งานครั้งแรกใน OpenSSH เมื่อเดือนมีนาคม 2002 หลังจากนั้นจึงถูกนำไปใช้กับโปรแกรมหลากหลาย เช่น bgpd(8), dhclient(8), smtpd(8), tmux(1)
- การเพิกถอนสิทธิ์ (Privilege Revocation): ใช้วิธีลดสิทธิ์ลงโดยยังคงรักษาทรัพยากรเฉพาะไว้ เช่น ping(8), traceroute(8)
- ตัวป้องกันสแตก (Stack Protector): อิงจาก "propolice" ที่พัฒนามาตั้งแต่ปี 2001 และเปิดใช้งานเป็นค่าเริ่มต้นใน OpenBSD 3.3
- W^X (Write XOR Execute): ถูกนำมาใช้ครั้งแรกใน OpenBSD 3.3 และถูกบังคับใช้อย่างเข้มงวดโดยค่าเริ่มต้นตั้งแต่ OpenBSD 6.0
- การปกป้อง GOT และ PLT: ใน OpenBSD 3.3 มีการปรับปรุง ld.so ให้ปกป้อง GOT (Global Offset Table) และ PLT (Procedure Linkage Table)
- ASLR (Address Space Layout Randomization): OpenBSD 3.4 เป็นรุ่นแรกที่เปิดใช้งานเป็นค่าเริ่มต้น
- การวิเคราะห์และตรวจสอบ gcc-local(1): นำมาใช้ครั้งแรกใน OpenBSD 3.4
- การเสริมความปลอดภัยให้ malloc(3): ใช้การสุ่มและการหน่วงเวลาการคืนหน่วยความจำขณะจัดสรร และถูกเขียนใหม่ใน OpenBSD 4.4
- ไฟล์ปฏิบัติการแบบไม่ขึ้นกับตำแหน่ง (PIE): OpenBSD 5.3 เป็นรุ่นแรกที่เปิดใช้งานเป็นค่าเริ่มต้น บนแพลตฟอร์มฮาร์ดแวร์ 7 แบบ
- การกำหนดค่าเริ่มต้นหน่วยความจำด้วยข้อมูลสุ่ม: OpenBSD 5.3 เพิ่มเซกชัน ELF
.openbsd.randomdata - ตัวป้องกันสแตกแยกตาม shared object: OpenBSD 5.3 ใช้คุกกี้ตัวป้องกันสแตกแยกสำหรับแต่ละ shared object
- Static-PIE: รองรับไบนารีสแตติกแบบไม่ขึ้นกับตำแหน่งใน /bin, /sbin และ RAM disk นำมาใช้ใน OpenBSD 5.7
- การบรรเทาการโจมตี SROP: เปิดใช้งานเป็นค่าเริ่มต้นใน OpenBSD 6.0
- การสุ่มลำดับการโหลดไลบรารี: เปิดใช้งานเป็นค่าเริ่มต้นใน OpenBSD 6.0 และ 6.2
- การปรับปรุง lazy-binding เพื่อความปลอดภัยแบบ W^X ในสภาพแวดล้อมหลายเธรด: นำมาใช้ใน OpenBSD 5.9
- การเสริมความแข็งแกร่งของเลย์เอาต์หน่วยความจำ: ใช้กับทุกโปรแกรมและไลบรารีใน OpenBSD 6.1
- การใช้แนวทาง fork+exec: เสริมการปกป้อง address space ในโปรแกรมที่แยกสิทธิ์
- trapsleds: ใช้เทคนิคแปลง NOP เพื่อบรรเทาการโจมตี ROP (Return-Oriented Programming)
- รีลิงก์เคอร์เนลตอนบูต: สุ่มเลย์เอาต์ภายในเคอร์เนลใหม่ทุกครั้งที่บูต
- การเสริมความปลอดภัยให้ลำดับคำสั่งของ i386/amd64: เป็นการปรับปรุงเพื่อทำให้การโจมตี ROP ทำได้ยากขึ้น
- การเพิ่มออปชัน MAP_STACK: ป้องกันการนำหน่วยความจำที่ไม่ใช่สแตกไปใช้ในทางที่ผิดในการโจมตี ROP
- RETGUARD: กลไกการป้องกันที่แข็งแกร่งกว่าตัวป้องกันสแตกแบบเดิม เริ่มใช้ตั้งแต่ OpenBSD 6.4
- การเพิ่มออปชัน MAP_CONCEAL: ป้องกันไม่ให้ข้อมูลอ่อนไหวรั่วไหลใน core dump
- การบล็อก system call จากหน่วยความจำ PROT_WRITE: นำมาใช้ใน OpenBSD 6.5
- การตรึงตำแหน่ง system call: จำกัดให้สามารถเรียก system call ได้จากตำแหน่งที่กำหนดเท่านั้น
- การเสริมการปกป้อง address space: จำกัดการเปลี่ยนแปลงหน่วยความจำผ่าน mmap(2), mprotect(2) เป็นต้น
- รีลิงก์ sshd ตอนบูต: นำมาใช้ใน OpenBSD 7.2
- รองรับโค้ดแบบไม่อ่านได้ (xonly): จำกัดไม่ให้อ่านหน่วยความจำที่รันได้
- การปกป้อง system call ด้วย pinsyscalls(2): ปกป้องโดยลงทะเบียนตำแหน่ง system call ไว้ล่วงหน้า
- การปกป้องเป้าหมายของ indirect branch (BTI, IBT): ใช้ฟีเจอร์ความปลอดภัยที่อิงฮาร์ดแวร์
- เพิ่มฟีเจอร์
-fret-clean: ป้องกันไม่ให้ค่าที่คืนกลับค้างอยู่บนสแตกและช่วยปิดกั้นการรั่วไหลของข้อมูล ปัจจุบันใช้กับ amd64 เท่านั้น
ฟังก์ชัน (Functions)
- issetugid(2): ฟังก์ชันที่นำมาใช้ใน OpenBSD 2.0 เพื่อตรวจสอบว่าโปรเซสมีการตั้งค่า user ID หรือ group ID ระหว่างการทำงานหรือไม่
- arc4random(3): ฟังก์ชันสร้างเลขสุ่ม เพิ่มเข้ามาใน OpenBSD 2.1
- bcrypt(3): ฟังก์ชันสำหรับแฮชรหัสผ่าน เปิดตัวครั้งแรกใน OpenBSD 2.1
- strlcpy(3), strlcat(3): ฟังก์ชันสำหรับคัดลอกและต่อสตริงอย่างปลอดภัย นำมาใช้ใน OpenBSD 2.4
- strtonum(3): ฟังก์ชันแปลงสตริงเป็นตัวเลขพร้อมป้องกันข้อผิดพลาด นำมาใช้ใน OpenBSD 3.6
- imsg: API สำหรับส่งข้อความ ใช้ในเดมอนหลากหลายตัว และถูกเพิ่มเข้า libutil ใน OpenBSD 4.8
- timingsafe_bcmp(3): ฟังก์ชันเปรียบเทียบไบต์ที่รับประกันเวลาในการทำงานคงที่ นำมาใช้ใน OpenBSD 4.9
- explicit_bzero(3): ฟังก์ชันสำหรับลบข้อมูลในหน่วยความจำอย่างปลอดภัย เพิ่มเข้ามาใน OpenBSD 5.5
- ohash: อิมพลีเมนเทชัน hash table รวมอยู่ใน libutil ใน OpenBSD 5.6
- asr: ตัวแปลชื่อ DNS ทางเลือก เปิดใช้งานใน OpenBSD 5.6
- reallocarray(3): ฟังก์ชันที่ป้องกัน overflow ระหว่างการจัดสรรหน่วยความจำใหม่ เพิ่มเข้ามาใน OpenBSD 5.6
- getentropy(2): ฟังก์ชันที่ให้เลขสุ่มที่ปลอดภัยเชิงความมั่นคง นำมาใช้ใน OpenBSD 5.6
- sendsyslog(2): ฟังก์ชันสำหรับส่งข้อความ syslog จากเคอร์เนล เพิ่มเข้ามาใน OpenBSD 5.6
- timingsafe_memcmp(3): ฟังก์ชันเปรียบเทียบหน่วยความจำที่รับประกันเวลาในการทำงานคงที่ นำมาใช้ใน OpenBSD 5.6
- pledge(2): ฟังก์ชันที่เพิ่มความปลอดภัยด้วยการจำกัด system call เพิ่มเข้ามาใน OpenBSD 5.9
- getpwnam_shadow(3), getpwuid_shadow(3): ฟังก์ชันสำหรับค้นหาข้อมูลรหัสผ่านแบบ shadow เพื่อเสริมความปลอดภัย นำมาใช้ใน OpenBSD 5.9
- recallocarray(3): ฟังก์ชันที่เติมข้อมูลเดิมด้วย 0 ระหว่างปรับขนาดหน่วยความจำ เพิ่มเข้ามาใน OpenBSD 6.1
- freezero(3): ฟังก์ชันที่เติม 0 ให้หน่วยความจำก่อนปล่อยคืน นำมาใช้ใน OpenBSD 6.2
- unveil(2): ฟังก์ชันที่จำกัดการเข้าถึงระบบไฟล์ เพิ่มเข้ามาใน OpenBSD 6.4
- malloc_conceal(3), calloc_conceal(3): ให้ความสามารถในการปกป้องข้อมูลอ่อนไหวระหว่างจัดสรรหน่วยความจำ เพิ่มเข้ามาใน OpenBSD 6.5
- ober: API ของ ASN.1 Basic Encoding Rules ย้ายไปยัง libutil ใน OpenBSD 6.6
โปรแกรมและซับซิสเต็ม (Programs and Subsystems)
- ยูทิลิตีที่เกี่ยวข้องกับ YP: ypbind(8), ypset(8), ypcat(1), ypmatch(1), ypwhich(1), เพิ่มการรองรับใน libc แจกจ่ายครั้งแรกใน NetBSD 0.9
- ypserv(8): เซิร์ฟเวอร์ YP ที่นำมาใช้ใน OpenBSD 2.0
- mopd(8): เดมอนที่รองรับ MOP (Maintenance Operations Protocol) เพิ่มเข้ามาใน OpenBSD 2.0
- AnonCVS: ระบบที่ออกแบบมาเพื่อให้เข้าถึงคลังซอร์สโค้ดของ OpenBSD แบบไม่ระบุตัวตน
- aucat(1): ยูทิลิตีที่เกี่ยวข้องกับ audio server เพิ่มเข้ามาใน OpenBSD 2.1
- OpenSSH: เครื่องมือสื่อสารปลอดภัยบนพื้นฐาน SSH นำมาใช้ใน OpenBSD 2.6
- mg(1): โปรแกรมแก้ไขข้อความแบบเบา รวมอยู่ใน OpenBSD 2.7
- m4(1): macro processor ที่ได้รับการขยายและบำรุงรักษาต่อหลัง OpenBSD 2.7
- pf(4), pfctl(8), pflogd(8), authpf(8), ftp-proxy(8): ไฟร์วอลล์สำหรับกรองแพ็กเก็ต เพิ่มเข้ามาใน OpenBSD 3.0
- systrace(4), systrace(1): เครื่องมือตรวจสอบ system call เพิ่มเข้ามาใน OpenBSD 3.2 แต่หลัง OpenBSD 5.9 ก็ถูกแทนที่ด้วย pledge(2)
- spamd(8): เดมอนสำหรับกรองสแปม นำมาใช้ใน OpenBSD 3.3
- dc(1), bc(1): ยูทิลิตีเครื่องคิดเลข เพิ่มเข้ามาใน OpenBSD 3.5
- sensorsd(8): เครื่องมือตรวจสอบ hardware sensor รวมอยู่ใน OpenBSD 3.5
- pkg_add(1): ยูทิลิตีจัดการแพ็กเกจ นำมาใช้ใน OpenBSD 3.5
- carp(4): โปรโตคอล network interface สำหรับ failover เพิ่มเข้ามาใน OpenBSD 3.5
- OpenBGPD: เดมอน routing แบบ BGP นำมาใช้ใน OpenBSD 3.5
- dhclient(8), dhcpd(8): ไคลเอนต์และเซิร์ฟเวอร์ DHCP เพิ่มเข้ามาในช่วง OpenBSD 3.5~3.6
- hotplugd(8): เดมอนจัดการเหตุการณ์ hotplug เพิ่มเข้ามาใน OpenBSD 3.6
- OpenNTPD: เดมอน NTP (Network Time Protocol) เพิ่มเข้ามาใน OpenBSD 3.6
- dpb(1): ระบบ build package แบบกระจาย นำมาใช้ใน OpenBSD 3.6
- ospfd(8), ospfctl(8), ospf6d(8): เดมอน routing OSPF (Open Shortest Path First) นำมาใช้ในช่วง OpenBSD 3.7~4.2
- ifstated(8): เครื่องมือจัดการสถานะอินเทอร์เฟซ เพิ่มเข้ามาใน OpenBSD 3.8
- bioctl(8): เครื่องมือจัดการ block device และ RAID รวมอยู่ใน OpenBSD 3.8
- hostapd(8): เครื่องมือจัดการ wireless access point นำมาใช้ใน OpenBSD 3.8
- watchdogd(8): watchdog timer ที่ช่วยรับประกันเสถียรภาพของระบบ เพิ่มเข้ามาใน OpenBSD 3.8
- sdiff(1): ยูทิลิตีเปรียบเทียบไฟล์ นำมาใช้ใน OpenBSD 3.9
- dvmrpd(8), dvmrpctl(8): รองรับ DVMRP (Distance Vector Multicast Routing Protocol) เพิ่มเข้ามาใน OpenBSD 4.0
- ripd(8), ripctl(8): รองรับ RIP (Routing Information Protocol) รวมอยู่ใน OpenBSD 4.1
- pkg-config(1): เครื่องมือกำหนดค่าแพ็กเกจ นำมาใช้ใน OpenBSD 4.1
- relayd(8), relayctl(8): เครื่องมือรีเลย์ทราฟฟิกเครือข่าย เพิ่มเข้ามาใน OpenBSD 4.1
- cwm(1): window manager แบบเบา เพิ่มเข้ามาใน OpenBSD 4.2
- libtool(1): เครื่องมืออัตโนมัติสำหรับสร้างไลบรารี รวมอยู่ใน OpenBSD 4.3
- snmpd(8): เดมอน SNMP (Simple Network Management Protocol) เพิ่มเข้ามาใน OpenBSD 4.3
- sysmerge(8): เครื่องมือรวมไฟล์คอนฟิกของระบบ เพิ่มเข้ามาใน OpenBSD 4.4
- ypldap(8): เซิร์ฟเวอร์ YP ที่อิง LDAP รวมอยู่ใน OpenBSD 4.4
- OpenSMTPD: เซิร์ฟเวอร์ SMTP (Simple Mail Transfer Protocol) นำมาใช้ใน OpenBSD 4.6
- tmux(1): terminal multiplexer รวมอยู่ใน OpenBSD 4.6
- ldpd(8), ldpctl(8): รองรับ Label Distribution Protocol (LDP) เพิ่มเข้ามาใน OpenBSD 4.6
- mandoc(1): เครื่องมือจัดทำเอกสาร manual page นำมาใช้ใน OpenBSD 4.8
- ldapd(8), ldapctl(8): เซิร์ฟเวอร์ LDAP (Lightweight Directory Access Protocol) เพิ่มเข้ามาใน OpenBSD 4.8
- OpenIKED: อิมพลีเมนเทชันของโปรโตคอล IKE (Internet Key Exchange) นำมาใช้ใน OpenBSD 4.8
- iscsid(8), iscsictl(8): เดมอน iSCSI รวมอยู่ใน OpenBSD 4.9
- rc.d(8), rc.subr(8): การจัดการสคริปต์เริ่มต้นระบบ เพิ่มเข้ามาใน OpenBSD 4.9
- npppd(8), npppctl(8): เดมอน PPP (Point-to-Point Protocol) เพิ่มเข้ามาใน OpenBSD 5.3
- ldomd(8), ldomctl(8): เครื่องมือจัดการ LDOM (Logical Domains) รวมอยู่ใน OpenBSD 5.3
- sndiod(8): audio server นำมาใช้ใน OpenBSD 5.3
- cu(1): ยูทิลิตีสื่อสารผ่าน serial เพิ่มเข้ามาใน OpenBSD 5.4
- slowcgi(8): เครื่องมือสำหรับจัดการคำขอ HTTP ที่ช้า รวมอยู่ใน OpenBSD 5.4
- signify(1): เครื่องมือเซ็นและตรวจสอบไฟล์ เพิ่มเข้ามาใน OpenBSD 5.5
- LibreSSL: โครงการที่ fork มาจาก OpenSSL เพื่อเสริมความปลอดภัย เปิดตัวครั้งแรกใน OpenBSD 5.6
- httpd(8): เว็บเซิร์ฟเวอร์แบบเบา รวมอยู่ใน OpenBSD 5.6
- rcctl(8): ยูทิลิตีจัดการบริการ rc.d เพิ่มเข้ามาใน OpenBSD 5.7
- doas(1): ยูทิลิตียกระดับสิทธิ์แบบเรียบง่าย นำมาใช้ใน OpenBSD 5.8
- radiusd(8): อิมพลีเมนเทชันเซิร์ฟเวอร์ RADIUS เพิ่มเข้ามาใน OpenBSD 5.8
- eigrpd(8), eigrpctl(8): รองรับ EIGRP (Enhanced Interior Gateway Routing Protocol) รวมอยู่ใน OpenBSD 5.9
- vmm(4), vmd(8), vmctl(8): ระบบจัดการ virtual machine เพิ่มเข้ามาใน OpenBSD 5.9
- acme-client(1): ไคลเอนต์ออกใบรับรองโดยใช้โปรโตคอล ACME นำมาใช้ใน OpenBSD 6.1
- syspatch(8): เครื่องมือจัดการ security patch เพิ่มเข้ามาใน OpenBSD 6.1
- xenodm(1): XDM เวอร์ชัน fork ที่ถูกปรับให้สะอาดขึ้น รวมอยู่ใน OpenBSD 6.1
- unwind(8): local DNS resolver นำมาใช้ใน OpenBSD 6.5
- sysupgrade(8): เครื่องมืออัปเกรดระบบอัตโนมัติ เพิ่มเข้ามาใน OpenBSD 6.6
- rpki-client(8): ไคลเอนต์ RPKI (Route Origin Validation) นำมาใช้ใน OpenBSD 6.7
- resolvd(8): เครื่องมือจัดการการตั้งค่า DNS ในสภาพแวดล้อมเครือข่ายแบบไดนามิก เพิ่มเข้ามาใน OpenBSD 6.9
- dhcpleased(8): ไคลเอนต์ DHCP ที่ปรับปรุงแล้ว รวมอยู่ใน OpenBSD 6.9
โครงการที่นักพัฒนา OpenBSD ดูแลรักษานอกเหนือจาก OpenBSD
- sudo: เครื่องมือที่ช่วยให้ผู้ดูแลระบบมอบสิทธิ์ให้ผู้ใช้บางรายรันคำสั่งที่จำกัดได้ รวมอยู่ใน OpenBSD 2.7
- femail: เครื่องมือส่งเมลง่าย ๆ เริ่มต้นในปี 2005 และมี OpenBSD port ให้ใช้เมื่อ 22 กันยายนปีเดียวกัน
- midish: MIDI sequencer และเครื่องมือประมวลผล เริ่มต้นในปี 2003 และมี OpenBSD port ให้ใช้เมื่อ 4 พฤศจิกายน 2005
- fdm: เครื่องมือกรองและจัดระเบียบเมล เริ่มต้นในปี 2006 และมี OpenBSD port ให้ใช้เมื่อ 18 มกราคม 2007
- toad: เครื่องมือปรับใช้ซอฟต์แวร์อัตโนมัติสำหรับ OpenBSD เริ่มต้นในปี 2013 และมี OpenBSD port ให้ใช้เมื่อ 8 ตุลาคมปีเดียวกัน
- docbook2mdoc: เครื่องมือแปลงเอกสาร DocBook เป็นรูปแบบ manual page แบบ mdoc เริ่มต้นในปี 2014 และมี OpenBSD port ให้ใช้เมื่อ 3 เมษายนปีเดียวกัน
- portroach: เครื่องมือติดตามอัปเดตพอร์ตที่พัฒนาจากการ fork ของ portscout จาก FreeBSD เริ่มต้นในปี 2014 และมี OpenBSD port ให้ใช้เมื่อ 5 กันยายนปีเดียวกัน
- cvs2gitdump: เครื่องมือแปลงคลัง CVS เป็น Git เริ่มต้นในปี 2012 และมี OpenBSD port ให้ใช้เมื่อ 1 สิงหาคม 2016
- Game of Trees: ระบบควบคุมเวอร์ชันที่อาจใช้แทน Git ได้ เริ่มต้นในปี 2017 และมี OpenBSD port ให้ใช้เมื่อ 9 สิงหาคม 2019
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
มูลนิธิ OpenBSD ระดมทุนได้ราว 380,000 ดอลลาร์
John Ioannidis เสียชีวิตไปเมื่อไม่กี่สัปดาห์ก่อน และแทบไม่มีใครสังเกตเห็น
นอกเหนือจากดีไซน์ privdrop/privsep ของ OpenBSD และการนำ pledge(2)/unveil(2) มาใช้ งานด้านการลดความเสี่ยงอย่าง mimmutable ในช่วงหลังก็แทบไม่ได้รับความสนใจ
มีการอิมพลีเมนต์หน่วยความจำข้อมูลแบบสุ่มใน OpenBSD 5.3 โดย Matthew Dempsky
AmigaOS ใช้ position-independent executable (PIE) และ ASLR มาตั้งแต่ปี 1985
แสดงความประหลาดใจที่ pledge/unveil ไม่ได้ถูกนำเสนอให้เด่นกว่านี้
สงสัยว่า OpenBSD ได้อิมพลีเมนต์ ISO C11 _Thread_local แล้วหรือยัง
ตั้งคำถามว่าทำไมหน้าเว็บ OpenBSD ถึงใช้เพียง HTML พื้นฐานโดยไม่มีการตกแต่งหรือใช้ CSS
แนะนำแหล่งข้อมูลดี ๆ อีกแห่งคือ <a href="https://why-openbsd.rocks/" rel="nofollow">https://why-openbsd.rocks/</a>