Big Ben

一个半吊子的编码爱好者

0%

简介

Pointer Authentication是ARM v8.3特性,Qualcomm和Apple的芯片均使能了该功能。Apple在iOS12中引入该功能,并通过PAC实现了用户态以及内核态的CFI,DFI。

PAC利用内存虚拟地址的高位存储内存地址的MAC值来计算和验证指针的完整性,从而保证控制流和数据流的完整性。

如Linux内核文档Documentation/arm64/pointer-authentication.rst中描述,PAC特性使用从54位开始到VA_SIZE位的空闲位存储PAC值。一般虚拟地址有效位为48位,那么用于PAC的就是7位,如果VA_SIZE是52位,那么PAC就只有4位。
与PAC类似的MTE特性,如Documentation/arm64/pointer-authentication.rst所述,则使用虚拟地址的59-56位。

工作原理

PAC的工作原理如下图所示:

假设指针值为ptr,且虚拟地址有效长度为48位,则PAC = ptr[54..48] = QARMA(ptr[47..0], context, key)。其中QARMA为ARM为PAC设计的MAC算法,算法输入为:

Read more »

SELinux对socket的控制包含这几个方面:

  • context语法中的nodecon, portcon, netifcon:这一类控制本端系统资源,确保合法进程才能访问本端网络资源
  • 通过iptables工具的SECMARK/CONNSECMARK扩展为socket packet打上的标签:这一类控制socket包的流向,确保只有合法进程才能访问某些网络报文
  • NetLable/Labeled IPSec:这一类还没看,留待后面继续学习
    本文关注第二种控制方法,并结合iptables,简要阐述其工作原理和使用方法。

    iptables简介

    from wiki
    iptables is a user-space utility program that allows a system administrator to configure the IP packet filter rules of the Linux kernel firewall, implemented as different Netfilter modules. The filters are organized in different tables, which contain chains of rules for how to treat network traffic packets. Different kernel modules and programs are currently used for different protocols; iptables applies to IPv4, ip6tables to IPv6, arptables to ARP, and ebtables to Ethernet frames.

iptables其实就是Linux的防火墙,用户通过配置各种规则来实现数据包的过滤。他利用了Linux的Netfilter框架的hook点对数据包进行判断,并执行action。例如:

1
2
iptables -A INPUT -s 10.10.10.10 -j DROP # 来自10.10.10.10的packet全部被丢弃
iptables -A INPUT -s 10.10.10.0/24 -j DROP # 来自10.10.10.0/255.255.255.0(24表示掩码位数)的packet全部被丢弃

Read more »

内核socket架构介绍

socket编程的用户态接口是:

1
2
int socketpair(int domain, int type, int protocol, int fd[2]);
int socket(int domain, int type, int protocol);

domain
定义在Linux内核目录include/linux/socket.h文件中,常用的有:

我们通常用AF_(Address Family)取代PF_(Protocol Family)。在内核代码中也有所体现:

type
当前定义的类型为:

  • SOCK_STREAM
  • SOCK_DGRAM
  • SOCK_RAW

protocol
决定协议的种类。例如针对AF_INET类型socket,可以有不同的网络协议,例如:SOCK_STREAM的默认协议是IPPROTO_TCP,SOCK_DGRAM的默认协议为IPPROTO_UDP。这些协议类型定义的位置,以musl为例,在include/netinet/in.h中。不过大多时候,传0就好了,例如:socket(AF_INET, SOCK_STREAM, 0)

Read more »

fPIC vs. fPIE

这两个都是编译选项,具体可以参考GCC的官方文档 。其作用就是

参考[4], 实际-fPIC和-fPIE的区别非常有限。

It works very much like what PIC does for dynamic libraries, the difference is that a Procedure Linkage Table (PLT) is not created, instead PC-relative relocation is used.

差别就是体现在导出的全局变量上。如果使用-fPIE编译的.o文件,则不会为这些全局变量创建PLT表项。但用-fPIC选项则会创建。则使用-fPIC编译的代码,性能会略差。参考[5],这一点性能损失也非常有限

Read more »

通常commtter都是一些比较资深的员工,因为通过阅读代码发现问题,需要:

  • 迅速读懂代码,意味着比较好的代码抽象能力
  • 通过阅读代码识别问题,意味着比较丰富的编码经验和调试经验

那是不是职场新人就不适合对别人的代码code review呢?这可能是很多人的第一印象,但如果你是新人,也这么想,那么你就失去了很多主动学习的机会。

code review更多的是一个沟通过程。评审人毕竟不是owner,他对代码的熟悉程度大概率是远不如提交人的。评审者多是根据自身的开发经验,以及短时间内对提交代码的理解发现问题。大多数时候,因为每个人的经验,性格,看问题的角度不同,多数时候是抛出一些问题,并形成讨论。当思想发生碰撞时,确实会发现一些问题,或者形成一些更好的想法和设计。这些都是code review能够带来的好处。虽然代码评审需要比较深厚的编码功力,但并不意味着参与代码评审对新人没有任何意义。

新人参与code review的好处

Read more »

Eminem的《8英里》和宋岳庭的《Life is struggle》是中外说唱届两首史诗级的歌曲。Eminem还有一部同名的自传体电影,讲述了Eminem的成名经历——他如何从一个街头小混混最后走上正轨。是的,不是成功,是正轨。可能Eminem认为这一步选择比Doctor Dre最后选择他,对他人生的意义更重大。

影片的风格非常写实,与其他记录片不同的是,《8英里》电影结束的时候,Eminem还是一个名不见经传的打工人。电影最后一个镜头是Eminem坐在公交车上,背景音乐不断响起《8 mile》这首歌的片段。Eminem时而望向窗外的八英里路,时而低头写着什么。此时的他应该正在创作《8 mile》这首歌——他的成名曲,影响了成千上万rapper的金曲。也成功打动了他的伯乐Doctor Dre。

整部影片的色调昏暗,剧情也很沉闷,所以IMDb评分不高(7.1)。我看这部片子的时候还在读书,当时也只当是偶像的传记,仅此而已。

若干年后,一次又一次听到这首歌,恍惚已经十来年了。这首歌常年在我的歌单中,只是人经历多了,就突然会有些感悟。

Eminem起初是个小混混,没有正经工作,然后身边都是来自街头的狐朋狗友。Eminem喜欢rap,有点水平,也混迹于club。他的朋友们告诉他你就是个说唱天才,你随便去battle,就会有制作人来相中你。然后跪舔着让你出专辑,然后大卖,然后你就是巨星了。但实际上是,

Read more »

红楼梦里面有一个无足轻重的“小人物”,叫贾瑞。他是荣宁两府的远房亲戚。贾瑞的爷爷贾代儒是代字辈的老学究,也就是贾宝玉的爷爷辈。贾代儒终身未取功名,只能在贾家的私塾当个教书先生,带一帮纨绔子弟读书。贾代儒的孙子也就是贾瑞,只能随爷爷做个小助教,越发的没有地位。贾瑞约摸20出头年纪,比起宝玉大不了几岁,论辈分还是个哥哥辈。但论地位,却如何比得上着红袍戴金冠的芊芊公子哥。偏偏这样一个小把戏,却爱上了两府最有势力,又最势利,最狠辣的凤辣子。可想见最后是没什么好果子的。但观其走向灭亡的过程,也是令人不甚唏嘘。

第一遍读红楼的时候,也没太关注过这个人,只是对风月宝鉴略有印象。然后对贾瑞的印象,也就是个形容猥琐的好色之徒。这次读《蒋勋读红楼》的时候,通过蒋公的解读,才领略到贾瑞的可怜。其实贾瑞能和秦可卿同章去世,作为警幻仙子秦可卿的对照面,又死于风月宝鉴之下(红楼梦有一个版本就叫《风月宝鉴》),可见曹雪芹在这个人物身上是蕴含了深意的。

佛教常说贪嗔痴三毒。贪字,嗔字好解,都是不好的意思。贪字为贪念,人如果欲望与现实脱节,就会产生贪念。嗔为嗔怒,因为欲望得不到满足,人就会出离愤怒。贪嗔二字给人带来不好的情绪。偏偏这个痴字不太好解。痴为妄想,执着一念,而抛弃理智,按佛道的观念,应当也是一种不好的情绪。人应当远离。但现今社会倒慢慢提倡这种痴,例如:对一个人忠贞不渝称为痴情,对一件事追求极致称为痴迷。似乎痴字都快成褒义词了。

贾瑞对王熙凤的用情就可谓痴情。

他们的家世完全不般配,而王熙凤又十分厉害。王熙凤每一次故意戏弄他,他总是一而再再而三地上当。
他其实很痴,他被王熙凤骗了一个晚上,寒冬腊月蹲在地上冻了一夜,回去又被他祖父打了一顿。第二天他去找王熙凤的时候,王熙凤立刻抱怨他,说你昨晚怎么没有来,他马上觉得是他自己错了,赶快跟王熙凤再约。

Read more »

最近比较迷群晖的docker。虽然电子书库对我来说用处不是很大,但也忍不住折腾了一番。最后导入藏书的时候才发现,原来像收破烂一样,收了很多书,真正读的不过1,2成。最近看过一些整理笔记或者知识管理的博文,里面提到知识应当不断整理,才能转化为自己的知识。这些收藏在角落里的应当果断地断舍离。这是题外话了。
本文主要还是记录一些折腾心得,希望可以帮到需要的人,可以节省一些时间和精力。网络上其实有很多已经实践了的文章,可作参考:

Calibre是一个电子书管理软件,请看“calibre - 电子书管理”。然后,有热心网友,将其web化,提供了基于Bootstrap框架的web客户端,即“janeczku/calibre-web”。再然后,docker镜像也就应运而生,于是群晖结合docker又具备了新的可玩性。Calibre-web的docker镜像主要有两个:

在群晖的docker中都可以安装,两款docker的主要区别在于后者不包含电子书格式转换模块,而前者则是包含了转换模块。可以将电子书转换成不同格式,例如:PDF,EPUB,AZW3,MOBI等等。

Read more »

最近在某一次讨论测试的话题中,有一位同事认为“重构结果看护,用集成测试(Integration Test)就可以了,UT看护的逻辑太小,导致修改过于频繁,维护成本太高,没必要。”

几种测试名词:

  • 单元测试(Unit Test或UT)
    针对小的代码逻辑编写的测试,不需要运行在真实环境上的,可以随时部署,随时运行,结果应当保持一致
  • 功能测试(Function Test)
    针对特性功能编写的测试,应当与实际运行环境保持一致,测试软件产品端到端功能
  • 集成测试(Integration Test)
    针对系统或子系统中某个组件的特性功能编写的测试,对其依赖组件进行打桩,并在真实环境进行部署测试,通常用于看护代码提交质量
  • 冒烟测试(Smoke Test)
    我们通常说的ST指的是冒烟测试,而非系统测试(System Test),冒烟测试与集成测试指代同一种测试

另外,IT或ST都是一种功能测试,除此之外,还有看护完整特性功能的测试,性能测试等,都属于功能测试

这位同学给出IT可以胜任看护重构结果的原因有:

  • IT通过对周边依赖进行打桩,可以达到80%的覆盖率,看护力度足够
  • 只要设计足够精巧,完成一个大型工程的IT只需要十分钟,运行速度足够快

因为在重构中,IT完全可以看护代码质量1⃣️,所以UT的作用就削弱了2⃣️。又因为UT看护粒度过细,导致UT代码维护困难,维护UT得不偿失3⃣️。而实际上,那个榜样部门就是这样做的——只用IT看护重构,库上代码放弃开发维护UT。

Read more »

RBAC, Role Based Access Control, 是SELinux的另一个重要的特性。但他并不是一种独立的控制方式,而是对TEAC的一种补充。其主要的作用是,构建SELinux提供的进程级的MAC机制与Linux的用户系统的映射关系。

RBAC工作原理

RBAC并不提供强制访问控制,而是通过user,role,type之间的对应关系,来控制type_transition策略能否成功。

role vs. type

role based最基本的就是定义role到type到对应关系。使用role语句可以实现:role role_name [types type_set];。例如:

Read more »