Are all BSDs created equally — 一次关于BSD内核漏洞的调查

Are all BSDs created equally — 一次关于BSD内核漏洞的调查

在今年(2017)的defcon大会上,Ilja van Sprundel做了一个名为 “所有的BSD生来是平等的吗?”(Are all BSDs created equally? ),副标题: 一次关于BSD系统内核漏洞的调查(A survey of BSD kernel vulnerabilities)。我在youtube上搜了一下,目前还没有视频。   浏览了一下pdf文件。主要内容如下: 作者花了三个月时间检查了OBSD/FBSD/NBSD的内核代码,主要涉及系统调用、驱动程序、TCP/IP栈、trap handler、文件系统以及用于兼容其他系统(如Linux)的代码,截止报告期,共发现bug或漏洞约115个,其中: FBSD: ~30 OBSD: 25 NBSD: ~60   作者列出的OpenBSD相关的bug有:   Unbound malloc and out of bound read (could panic or info leak) OpenBSD 6.1 Been there since OpenBSD 4.0 Fri Apr 28 08:34:31 2006 getcwd syscall when taking data from fuse / userland   mbuf mishandling, leading to crash Doesn’t guarantee it pulls up enough mbuf data OpenBSD…

Read More

使用syspatch为OpenBSD打补丁

使用syspatch为OpenBSD打补丁

从6.1版开始,OpenBSD支持使用二进制文件为系统打补丁,结束了每个补丁要用户自己下载源文件并编译、安装的历史,就像现在所有Linux发行版一样。也算是补上了一个短板。 syspatch的使用也很简单明了:

跟syspatch相关的配置: /etc/installurl : 指定到哪里去查找并下载补丁 这个文件默认不存在,需要自己创建并配置站点。这一点需要改进。有个默认的文件以及示例更合理一下。可以自己man installurl看一下。 配置内容可以是(就是一个URL): https://ftp.openbsd.org/pub/OpenBSD/ 跟syspatch相关的文件: /bsd.syspatch${OSrev} : 初始内核的备份文件(初始安装的、未打过任何补丁的内核) /var/syspatch/* : 保存了syspatch用于撤销补丁的压缩包(所以不能删除)   示例:

最后,reboot  

Read More

如何把一个软件移植到OpenBSD上

如何把一个软件移植到OpenBSD上

这是一篇根据此文意译的文章, 我只翻译了自己认为重要的东西。作者以自己移植python的dnslib库到OpenBSD的过程来描述移植的过程。作者为Bryan Everly。此译文发表时文章发布的原域名过期,无法访问。   事前准备 找到你想移植的软件 准备好承担做一个维护者的责任 和软件的开发者/团队协作,而不是为软件加几个补丁,让它在OB上能编译通过 你很可能没有权限把软件添加到ports中,请和ports邮件列表中的人合作 先读文档,再问问题 OpenBSD ports树传统 软件按类别放在/usr/ports目录下,如开发工具放在/usr/ports/devel,数据库软件放在/usr/ports/database等等 软件源码并不放在/usr/ports的任何目录下,而是在编译时从它的官网下载到/usr/ports/distfiles/PORT-v.v.v子目录下 实际编译时的工作目录在/usr/ports/pobj/PORT-v.v.v下 某个软件的ports包含如下标准的文件: Makefile — 包含编译指令 distinfo — 包含指定软件的验证信息,如tar包的SHA1/SHA256摘要信息 pkg — 子目录 pkg/DESCR — 关于此软件的简短描述,请保持列宽为72 pkg/PLIST — 由此ports编译成的软件包(package)的manifest文件 patches — 子目录,包含要为此软件的源码打的补丁包 大部分ports的Makefile的结尾会包含一个名为bsd.port.mk的文件。这个文件用于告诉ports如何利用OpenBSD现有的ports编译的基础架构。 以移植python库dnslib为例,在/usr/ports/net目录下新建一个文件夹py-dnslib,因为一个跟网络相关的工具,也是python的库文件,所以以py-开头。 接下来要创建Makefile.

第一行是注释,简短描述这个port的功能。 接下来的部分是版本号,要下载的源码包的名称,编译好的软件包的名称,最后是此软件在ports中的类别。 再往下是软件官网地址,port的维护者的信息。接下来的注释表示此软件采用BSD授权协议(可在软件的官方万展查询到)。接着的一行表示此软件可以放在OpenBSD发行的光盘中。 MASTER_SITES指示此软件的官方下载地址。 MODULES一行用于告知OpenBSD ports编译体系这是一个python包,可以使用OpenBSD上Python包的通用编译方式 FLAVORS表示软件的flavor(请查阅OpenBSD上flavor相关文档) 最后,do-test目标执行软件包自带的单元测试代码。   有了Makefile,接下来要测试各个编译目标 第一个就是make fetch,测试源文件下载是否正常。下载的文件会放在/usr/ports/distfiles下的一个子目录里。子目录的名称取决于你的Makefile里的$DISTNAME变量 然后是make extract。这个目标会把上面下载的源码压缩包解压,放在/usr/ports/pobj下的一个子目录里。子目录的名称取决于$WRKDIR(衍生与$PKGNAME) make makesum: 这个目标为下载的源文件产生校验和并放在distinfo文件里。 make update-patches:如果你需要给某个源文件打补丁,你会先把/usr/ports/distfiles/$DISTDIR下的目标文件复制到一个带后缀为.orig的文件,然后编辑目标文件,然后运行make update-patches。它会生成所需要的diff文件,然后你可以将它们放在patches子目录里。 make build: 实际编译源文件。 make update-plist: 这个目标会生成会更新pkg/PLIST文件 make do-test: 运行源文件自带的单元测试代码。 make fake:将编译好的软件安装在/usr/ports/pobj/$WRKDIR/fake-$MACHINE_ARCH文件夹下,而非根文件目录下 make package: 根据make fake生成的文件创建软件包 make install:将编译好的软件包安装的系统…

Read More

OpenBSD上doas用法简介

OpenBSD上doas用法简介

doas是OpenBSD 5.8上开始出现的一个程序,用来代替sudo。相比sudo,它的好处是配置简单明了。坏处嘛我还不知道,估计功能上没有sudo那么全面吧。因为我都是用sudo的一些基本功能(指定那些用户可以切换到root),所以对sudo的优势了解并不全面。另外就是,doas的配置完全不兼容sudo,且目前只有OpenBSD上才有。 doas的配置文件是/etc/doas.conf,配置规则如下

一个规则以permit(允许)或deny(拒绝)开头,  接下来是一些选项(options,非必须),然后是配置的用户名或用户组(identity部分),再接下来是这个用户(identity部分)可以(或不允许)以哪个用户(target)的身份来执行命令,用as关键词来表示。这也是可选的。如果省略,表示这个用户(identity)可以以任意用户的身份执行后面cmd关键词指定的命令;   cmd关键词用来指定允许(或拒绝)的命令,args关键词用来指定命令的参数; cmd 和args都是可选的。省略的话表示任意命令和参数。 选项(options)部分有一下两个选择: a. nopass , 表示用户无需输入密码 b. keepenv  { [ variables … ] },表示用户的使用环境将会被保持,如果不指定的话,默认是会重置的(除了这些变量: DISPLAY, HOME, LOGNAME, MAIL, PATH, TERM, USER and USERNAME.)。keepenv还可以指定具体那些变量被保持。将需要保持的变量名称放在大括号中,多个时以空格分开。 组以冒号加上组名称来表示,如 :wheel。 注释以#开始,直至该行结束。   下面再以示例来说明一下。 比如我们常用的让一个用户(如acheng)切换到root而无需知道root密码的配置:

这个规则让acheng用户可以以root身份执行任何命令,包括 ’su – ‘。 但是需要输入知己的密码。如果连这个也想省略掉,那就加上nopass选项:

如果想要这个wheel组的成员都可以这样做,规则如下:

  规则配置完成后,可以用doas的‘-C’参数来验证一下是否有错误:

  在使用时,acheng用户可以使用下面的命令来切换到root:

或者运行其它命令:

  如果需要以root用户之外的其它用户身份来执行命令,则要使用doas的 ‘-u username’参数。 当然,上面的例子中,只允许acheng切换到root用户,如果把其中的’as root’部分省略掉的话,则表示acheng可以以任意用户的身份执行命令。 最后,我们看一下doas.conf的手册中给出的几个例子: The following example permits users in group wsrc to build ports, wheel to…

Read More

OpenBSD上的服务管理程序rcctl

OpenBSD上的服务管理程序rcctl

rcctl 是OpenBSD系统上的后台进程(daemon)管理程序,功能上类似于以前redhat Linux上的chkconfig或新版中的systemctl。 它其实是一个shell脚本程序,最早见于OpenBSD 5.7。需要有root权限才可以使用。 它的原理主要是通过在/etc/rc.conf.local文件中设置相应进程的配置来完成。被管理的进程需要在/etc/rc.d/目录下有相应的控制脚本文件。 主要功能及示例 (下面的内容主要是根据rcctl的man手册翻译而来,我再加上一些范例。愿意的朋友可以自己阅读man手册) 启用或禁用后台进程(包括系统自带进程如httpd以及通过软件包安装的进程如mysqld/nginx等,下同)

启动或停止后台进程

也可以根据需要传入 -d (开启debug)或 -f (强制)参数 列出进程相关的参数

列出进程默认参数

如果你没修改过默认参数,那么它和get子命令的输出应该是相同的 列出符合特定条件的进程 rcctl ls $con 列出符合条件的进程。这里的条件不可以自定义,只可以从下面几个关键词选择: all      all services and daemons  ## 所有的服务和进程 faulty   enabled but stopped daemons ## 启用但未能启动的服务和进程 off      disabled services and daemons ## 禁用的服务和进程 on       enabled services and daemons  ## 启用的服务和进程 started  running daemons  ## 已经启动的进程 stopped  stopped daemons  ## 已经停止的进程

这里httpd和ntpd两个进程已经启用,但是未能启动(意味着管理员有活干了)。 调整pkg_scripts中进程的顺序 pkg_scripts这个变量是用来控制从软件包中安装的进程的。有多个进程的时候,我们有时候需要调整一下它们的顺序.

设置进程参数

Read More

case语句的fall through

当然我说的是SHELL,不是其它的编程语言。 在看<学习KSH》中看到,把’;&’字串放在case语句中,会让case语句“fall through”(暂时没想到如何翻译,看下面的脚本输出来看看fall through是怎么回事)。实际 测试了一下发现,OpenBSD (5.8)以及DragonFly BSD (4.2)中的KSH不支持这个功能。因为他们的KSH所谓的pdksh衍生版(public domain korn shell),而Ubuntu (15.04)中通过apt-get安装的ksh是原始的Korn Shell,支持’;&’的fall through功能。 BASH shell则是从4.0版以后开始支持。 脚本:

Ubuntu:

DragonFly BSD (4.2):

   

Read More

IPv6中的被请求节点组播地址

这是一个有特殊用途的组播地址,主要用于重复地址检测和获取邻居节点的链路层地址(相当于IPv4中的ARP解析)。这个组播地址的前104位是固定的,为 FF02::1:FF/104, 后24位由接口的单播地址的最后24位构成。假设某个接口的单播地址为2001:3234::1:253F,那么该接口就会自动归属于组播地址FF02::1:FF01:253F。 由于IPv6地址每16位划为一段,共8段,因此前面104位(FF02::1:FF/104)中最后的8位(也即FF)要和接口的单播地址中最后24位的前8位组合在一起形成一段。我们例子中单播地址的最后24位为01:253F(示例单播地址中倒数第二段的1其实是0001的简写),因此被请求节点组播地址为FF02::1:FF01:253F。 当此链路上其它网络接口需要给此IP发送数据时,它就会先给这个组播地址发送数据,请求它的链路层地址;而我们示例接口如果收到发往此组播地址的数据时也会进行处理和响应。同样,当某一个接口给自己配置IP地址的时候,也会使用这个组播地址来进行重复地址检测;也就是说如果这个新分配的IP地址的最后24位是01:253F,那么它也会发送数据报到这个组播地址,看看是否已经有其它接口配置了相同的IP地址,如果没有收到应答,则表示没有重复地址;如果收到应答,则会比对应答数据包的源地址来判断是否重复。

Read More

unix文件中的ctime, mtime和atime

今天需要使用find命令来查找一些文件,需要找到15天前创建的文件。究竟该用哪个参数呢,ctime,mtime还是atime? 那就再来复习一下这三个参数具体的意义吧。 不过,在谈论这三个参数之前,你得先了解inode(索引节点)的概念,不然是说不清的。inode是干嘛用的?它是用来存储文件属性的一个数据结构,比如文件的权限,所有者,大小,指向本文件的连接数等,当然也包括文件的更新时间等信息(但不包含文件名以及文件的内容)。在表现形式上,inode是一个数字,每个文件都对应一个唯一的inode。可以使用ls命令的‘-i’参数来查看文件或目录的inode:

当新建一个文件时,系统会自动分配一个inode号码。 更具体的inode信息,大家可以网上搜索一下。今天不再详细介绍。 ok,有了这些背景信息,我们可以介绍这三个参数了。 ctime ctime是文件属性更新的时间。比如更新了文件的所有人,更改了文件的读/写/执行权限等。也可以理解为,任何对inode数据结构里的信息进行的更新都会引起ctime的更新(但下面atime的测试说明这个说法需要进一步考证) mtime 文件内容更新的时间。 这个是最直观的。你打开文件,编辑了其中的内容,在你保存时,系统会更新文件的mtime属性。 要注意的是,更新mtime时,通常也会需要更新ctime;有时候更新ctime却未必需要更新mtime(比如为文件添加可执行权限)。   atime 文件最后访问时间。 每次打开一个文件时,或者使用grep/sort等命令访问文件时系统也会更新文件的atime。 那么系统更新文件的atime,意味着文件的属性发生了改变,应该同时更新ctime。但下面的测试表明不是这样的。

上面的测试说明,使用grep命令访问了文件以后,atime(Access)更新了,但ctime(Change)并没有更新。不解中 …… 同时,如果以root账户测试,grep/cat/sort等命令不更新atime。 同时查看了一下文件系统的挂载选项,发现有一个‘relatime’的选项(如果使用了noatime选项挂载,系统就不会更新文件的atime):

mount手册这样解释relatime选项(我第一次知道这个选项,BSD类系统上没有这个):        relatime Update inode access times relative to modify or change time.  Access time is only updated if the previous access time was earlier  than the  current  modify  or change time.  (Similar to noatime, but it doesn’t break mutt or other applications that need to know if a file has…

Read More
1 2 3 6