delphij's Chaos

选择chaos这个词是因为~~实在很难找到一个更合适的词来形容这儿了……

18 Sep 2022

Moving toward a standarized qsort_r(3)

History of qsort_r(3)

First introduced in Research Unix V3 and eventually standardized as part of C Standard Library as of ANSI/ISO C89, qsort(3) provided an abstract interface where programmers can perform sort operation over an array of objects, by supplying a pointer to that array, the total number of the member objects, the size of individual member object, as well as a compare function. The compare function is expected to take two parameters, both pointers to a member object, and it shall return a negative number, 0, or a positive number, if the first object is considered smaller, equal, or greater respectively.

Read more...
26 Aug 2022

BIOS 串口波特率设置

今天 Warner 改了一段注释,我于是学到了一些新的 犀利而无用的知识,在这记一笔。

当从 BIOS 引导时,假如是使用 FreeBSD 的 boot manager(写入VBR的boot0或boot0sio), 该 boot manager 实现了一个菜单,因为这个菜单的原因,实现串口异步通讯的代码就塞不下了, 于是 boot0sio 会调用 BIOS int 14h 去初始化串口。

然而 int 14h 提供的接口是1981年的设计(IBM 5150的BIOS是1981年4月24日发表的, 当时只有 8 kB),用来表达波特率的只有3个bit,这3 bit作为波特率除数表的索引值, 该表在1981年写死成了:1047, 768, 384, 192, 96, 48, 24, 12,因此最高的波特率就是 115200 / 12 = 9600

由于 9600 还是比较慢(每秒只能传1200字节),因此现时的 BIOS / EFI 往往默认将串口波特率设为 115200,然而 FreeBSD 的 boot0sio 在引导时仍然会一上来就把串口波特率设为 9600, 解决方法是干脆不要用 boot0sio 而是使用 BIOS 提供的 Console Redirect 功能, 或是在编译时将 BOOT_COMCONSOLE_SPEED 设置为 0

Read more...
20 Aug 2022

TCP 协议合订本出了

我们现在所说的 TCP 协议通常是指 1981 年 9 月 发表的 RFC 793 和一系列后续 RFC 定义的协议,其主体定义距今已经超过 40 年了(当然如果细究下去的话, 第一份正式的文档是 RFC 675, 而 RFC 793 本身也是针对一年前的 RFC 761 的修正,不过大部分实现者使用的基础依然是 RFC 793)。 于本月18日发布的 RFC 9293 把过去四十几年针对 TCP 协议的各种修补全部合订到了一起,一次性地替代了 RFC 879 The TCP Maximum Segment Size and Related Topics、 RFC 2873 TCP Processing of the IPv4 Precedence Field、 RFC 6093 On the Implementation of the TCP Urgent Mechanism、 RFC 6429 TCP Sender Clarification for Persist Condition、 RFC 6528 Defending against Sequence Number Attacks、 RFC 6691 TCP Options and Maximum Segment Size (MSS)、 和主体 RFC 793 TRANSMISSION CONTROL PROTOCOL, 此外它整体替换了 RFC 1122 Requirements for Internet Hosts – Communication Layers 中关于 TCP 的全部内容。 Read more...
31 Jul 2022

在 Thunderbird 中使用另外的 email 地址和 SMTP 服务器发邮件

很久以前在 macOS 上配置了一次,然后具体怎么配给忘了一个干净,所以这次写一个作弊条。

Read more...
04 Jul 2022

Telegram Premium

Telegram 最近宣布了其订阅付费计划。 说起来我也不是特别信任其安全/隐私方面的特性(*),不过作为一个跨平台即时通讯软件来说, 其在不同平台上的功能基本上做到了完全一致,并且在这个礼崩乐坏 的时代,能够在不同平台上都做到不狂吃CPU/内存,在不同平台上的界面行为上高度一致, 并且完全没有各种令人抓狂的智障设计(举例来说:随便干什么事情都弄个二维码还非让你扫描一下借此获得摄像头权限、 多机登录时以手机为主并且时不时就得再扫描一次二维码、完全无法回溯的会话引用、 没头没脑地给一条「有人@你」的通知,却无法迅速定位到消息等等),并且公开客户端源代码以便第三方进行代码审计, 确实是十分难得的。

Read more...
20 Jun 2022

作弊条:SSH 的 ProxyJump 跳板服务

问题

有些环境中,SSH 服务器可能无法从 Internet 直接访问(例如,SSH 服务器可能使用的是一个私有 IP 地址,或是 Internet 服务提供商没有提供 IPv6 服务,而 SSH 服务器只提供 IPv6 服务)。

考虑到 SSH 已经进行了相互认证(连接时客户端会验证服务器的公钥是否与已知公钥,例如 ~/.ssh/known_hosts, 或是通过 DNSsec 发布的 SSHFP RR 匹配;服务器端则会验证用户是否能证明自己拥有与授权公钥对应的私钥), 因此比较常见的解决方法便是使用 VPN、在防火墙上穿孔,或是使用代理服务器。

由于 SSH 自身也提供了许多转发功能,因此如果中间的跳板服务器也提供 SSH 服务, 便可以使用这些跳转服务器直接作为代理服务器来用。与前面那些传统方法相比, 这样做的优点是避免了安装额外的软件,也不需要特别指定端口。

Read more...
12 Jun 2022

用 BHyVe 虚拟机解决 FreeBSD Wi-Fi 驱动的问题

BHyVe https://www.FreeBSD.org/ 10.0-RELEASE 起,系统提供了一个最早由 NetApp 开发的使用处理器提供的虚拟化硬件支持 (目前是 Intel VT 和 AMD-V;针对 ARM 平台的支持也在 https://reviews.freebsd.org/D26976) 的虚拟化环境 https://wiki.freebsd.org/bhyve,这套虚拟化环境可以运行支持 VirtIO 规范的各种操作系统,并提供了 UEFI 支持。 这套环境提供了 PCI 直通(passthrough) 能力。通俗地说,PCI 直通是直接把某个或某些原本应该由宿主(host) 管理的 PCI 总线上的硬件交给虚拟机(guest), 而非以虚拟化的方式由宿主系统代为管理的方式。 这样做的本意是绕过一层抽象来获得更好的性能,但有时也可以用来实现一些其他的目的。 FreeBSD 的 Wi-Fi 支持 FreeBSD 的 802.11 支持是 2003 年左右由 Sam Leffler 在引入 Atheros (现已被高通收购) 无线网卡支持时实现的。此后基于这套支持和公开文档,人们开发了一系列 Wi-Fi 驱动。 由于无线网络设备厂商已经在 Linux 驱动开发上进行了大量投资,目前 Linux 的 Wi-Fi 驱动较 FreeBSD 来说更为丰富。由于大部分此类驱动采取了 GPL / BSD 双许可证的授权, 因此比较理想的做法是实现 Linux 内核接口从而直接利用这些驱动,而不是从头重新开发一遍。 wifibox 考虑到已经有了虚拟化环境的支持,另一种可行的做法便是直接运行一个精简版的 Linux,用它来管理 Wi-Fi 硬件,然后通过 virtnet 来把网络接到 FreeBSD 上面来用。这样一来这个 Linux 虚拟机便实际上承担了驱动的角色。目前这种做法已经加入了 port (net/wifibox) 并可通过 pkg 直接安装。 Read more...
22 May 2022

伊万·伊万诺维奇的苏联笑话

苏联笑话经久不衰,今天看到方叔亲身经历的 伊万·伊万诺维奇现实版。 这个笑话还是挺逗的,第一次看到这个笑话应该还是中学时下了课跑去海淀图书城看到的闲书里看到的, 大致上是这样: 一个英国人、一个法国人和一个苏联人聚在一起讨论什么是世上最幸福的事情。 英国人说:最幸福的事情就是寒冷的冬夜在家里的壁炉前暖和。 法国人说:你们英国人太古板了,最幸福的事情是应该是和一个金发女郎一起去度假,然后好聚好散。 苏联人说:Ewww,你们这个都不行,最幸福的事情应该是:半夜有人敲门,开门后对方亮出克格勃证件说:「伊万·伊万诺维奇,您被捕了!」而我回答说:「克格勃同志,您搞错了,伊万·伊万诺维奇住在隔壁!」 Read more...
07 May 2022

用 FIDO key 来做 SSH key

OpenSSH 8.2 中新增了 FIDO/U2F 支持。 它支持两种密钥对类型: ecdsa-sked25519-sk。需要注意的是并非所有的 FIDO Security Key 都实现了 ed25519-sk 的硬件支持:例如,截至2022年,Titan Security Key 就不支持 ed25519-sk

使用 FIDO key 的 SSH key 在使用上和之前的 SSH key 类似, 主要的区别在于在登录时系统会确认用户是否在机器旁边(通常是碰一下 FIDO key), 这可以显著地改善安全性:与之前的 SSH key 不同的是, 即使机器上的 U2F/FIDO SSH key 私钥文件被攻击者获得, 在没有硬件 FIDO key 的情况下也无法使用这个私钥。 对于对方同时能获得私钥文件和物理访问的情况, 参见 xkcd/538,就不要跟扳手过不去了。

Read more...
03 May 2022

今天份草台

我觉得这事必须得记一笔。

去年9月的时候,我和张师傅在 eBay 上团购了两台 Juniper NFX250-S2。 昨天周师傅问我当时付了多少钱,于是我就打开了浏览器准备去 eBay 查一下交易记录。

诶?右上角那是啥?使用 Gmail 账户登录?这比他们自己那个 2FA 实现好多了啊,我于是想都没想就点了一下。

Read more...