Yandere@萌 https://blog.yandere.moe Mon, 25 Mar 2019 02:07:51 +0000 en-US hourly 1 https://wordpress.org/?v=5.3 悲报,不小心删库导致的 Onion 地址改变 https://blog.yandere.moe/moe/accidental-removed-private-keys/289.html https://blog.yandere.moe/moe/accidental-removed-private-keys/289.html#respond Mon, 25 Mar 2019 02:07:32 +0000 https://blog.yandere.moe/?p=289 本站 Onion 的地址变更为 gqnl3d7yfcge6ayhubuzvfgzx3pe76mvhqacrmm6as2howkfctodsxad.onion ,至于为什么改变还要从昨天说起。

昨天早晨起来和往常一样打开了树莓派的屏幕,树莓派链接了服务器的一个 Windows 的虚拟机用于测试环境用,然后发现 RDP 断开了,重新链接过了许久提示链接超时,这时心中不详的预感油然而生。

于是打开了日常用的笔记本电脑,用 virt-manager 链接进入服务器,发现 Windows 的虚拟机状态为“paused”,顿时有些好奇,于是 console 链接进入另外一台 Linux 虚拟机,刚登录成功之后瞬间这个虚拟机也被 paused 了。

于是尝试 resume 这个虚拟机,失败。强制关机,成功。重新开启,失败,原因为 “Permission Denied”。这时彻底方了,SSH 到服务器上查看日志,发现 SELinux 报错误,想了想我最近也没动服务器啊,难不成被黑了?不然不可能有人会动 SELinux 的配置。继续往下看,Hmmmm,No space left on device。好吧。

于是 df -H 了一下,发现跑这组虚拟机的磁盘空间满了,就剩 40 多 KB,博客虚拟机也在这一组上。

看了下大概是哪个 img 占用了所有的,发现是 Windows 虚拟机把磁盘空间吃光了,Windows 虚拟机里包括 3 个虚拟磁盘,虚拟磁盘 0:镜像容量 1 TB 剩 60 GB,虚拟磁盘 1: 镜像容量 1 TB,剩 700 多 GB,虚拟磁盘 2:分配最大占用容量 768 GB。跑的测试是在这个虚拟磁盘上的,然后跑的东西只能看到分配的容量,并不知道宿主机上还剩多少空间,就一直 extend 直到吃到满,然后炸了。当然当时预想的解决的方案是开机,然后把虚拟磁盘 2 的内容都转移到虚拟磁盘 1 上,然后删除虚拟磁盘 2。由于涉及到之前的历史遗留问题,也没想到当时分配的空间实际已经超过了 /data 总分区的空间。

要开机就得腾点儿空间出来,看了看就博客的网关机我敢动,其他的都不敢碰。网关机分配了 4 GB 的虚拟磁盘空间,实际使用了不到 1 GB,理论上 shrink 是从后面砍掉,所以当时就做了一个比较冒险的举动:直接 shrink raw image 的 size 到 3 GB,腾出 1 GB 的空间。

(当时没有意识到)网关机的分区表如下:
/boot 128 MB EFI 启动盘
/ 3.* GB 系统盘
/data 100 MB Tor Hidden Services 私钥存储

(有经验的读者应该已经在笑了)于是灾难就发生了。。。

Windows 机器的事情弄完之后删除了虚拟磁盘 2,顺利腾出了 700 多 GB 的空间,然后重新给网关机磁盘加了 1 GB 之后启动了博客的网关机,启动失败。打开了 console,发现文件系统损坏,然后 xfs_repair 了一下 /dev/vda2 和 /dev/vda3。当修复到 /dev/vda3 的时候死活找不到 superblocks,拿 hexedit 一看全都是空的,顿时心凉了,因为 Hidden Services 的私钥在 /dev/vda3 里,之后想起来之前的大力出奇迹强制 shrink 了,悔不当初。。。。。万万没想到我当时怎么分的区,把 key 放在磁盘最后面了,然后 shrink 掉了。

然后你懂的,因为已经覆盖了所以不可能再恢复出来了,所以就是这个样子,,,

]]>
https://blog.yandere.moe/moe/accidental-removed-private-keys/289.html/feed 0
正则表达式快速入门 https://blog.yandere.moe/moe/regex101/269.html https://blog.yandere.moe/moe/regex101/269.html#comments Mon, 04 Mar 2019 21:55:33 +0000 https://blog.yandere.moe/?p=269 得,最终博客还是咕了(接近) 5 个月,上次更新是 2018 年 10 月 7 日,再不发点儿什么说不过去了。正好最近的几个 Project 需要做规律处理,用到了正则表达式,于是写一写如何快速入门正则表达式。

首先啥是正则表达式?

总的来说,正则表达式(Regular Expression)是一个表达文本规律的运算符,例如你的系统上的 /dev 目录下上有 sda sdb sdc sdd sde sd.. 这几个驱动器,然后想 ls 列出他们,就可以用正则表达式使 ls 只列出 sd 开头的,而 sd[a-z] 则是这些文字共有的规律。

注意事项

不同的语言、工具可能使用不同的 implementation 实现正则表达式,本文中使用的正则表达式为 GNU Extended Regular Expression,即 grep -E 或 egrep 的实现。本文仅仅包含了一小部分的正则表达式语法供初学者入门,正则表达可以做更多的事情。

一些特殊符号

在正则表达式中,一些符号有特殊的意义,因此在使用这些符号时应使用 \ 来对这些符号进行 escape(即在 \ 符号之后的一个字符为字面意义,不解析为特殊意义)。

这些特殊符号有

符号
意义
^开始
$结束
[]单一字符列表
(用于检查文本中是否存在指定的单一字符)
()分组
?可选匹配(optional match)
+重复匹配
.任意单一字符
*一次或多次匹配符
{}重复匹配次数({0,3} {3,} {,5} 等)
\逃避符(escape)

开始符 ^

符号 ^ 表示一行文本的最启始的位置

表达式匹配匹配
^hehello
hen
helen
headache
computer
they
^ininternet
information
internatioal
saint
cabin
string
^wonwon
wonderful
wont
taekwondo

结束符 $

符号 $ 表示一行文本中最后结束的位置。

表达式匹配匹配
ly$fly
holy
ugly
flyman
polymath
lying
er$better
writer
reader
federal
version
verbose

组合使用 ^ 与 $

组合使用 ^ 与 $ 可实现对一个规律在一个段落中的完全匹配

表达式匹配不匹配
^ly$
lylying
polymath
holy
^he^hehelen
she
chew

单一字符匹配列表 []

通过 [] 符号可以表达需要匹配的字符的列表,在 grep 所使用的 正则表达式中,[] 可包含一个规律如 A-Z (大写字母A-Z),a-z (小写字母 a-z),0-9(数字 0-9),也可以包含单一的字母如:atg。当然规律也可以是不连续的如 E-J(字母 EFGHIJ),也可以是组合的如 A-Za-z0-47-9(所有大小写字母和 01234789)。

表达式匹配不匹配说明
[0-9]aa12345ff
345
3
30123ff
f241
english
hello
wonderful
nothelpful
world
0123456789
[A-Za-z]123world456
heLLo123
456world
123
456
789
abcdefghijklmnopqrstuvwxyzABCDEFGHJKLMNOPQRSTUVWXYZ
[A-Za-z0-47-9]asdf1234fghj
1234zxCv
zxcv4321
56
6
5565656566655656
abcdefghijklmnopqrstuvwxyzABCDEFGHJKLMNOPQRSTUVWXYZ01234789
[A-Gvbnm4-609]Access
version
9k
z5
XYZ78
8
888877
3LL
ABCDEFGvbnm45609

上面的例子读者们可能会产生一些疑问:表达式 [0-9] 中,为什么 aa12345ff 也会被匹配到?这是因为此表达式为 [0-9] 而非 ^[0-9]$,因此并不限定 0123456789 在段落中的哪个位置会出现,故此 aa12345ff 中,1 匹配到了 [0-9] 规律,所以被显示出来。当然,如果只希望看到被匹配到的,则可以使用 grep -o,-o 标记则只会显示匹配成功的内容。但是这样获得的结果将会是 1 2 3 4 5,在现实中实际意义可能不大,本文之后会讲到 + ? 和 {} 的使用。

[] 与 ^ 和 $ 的组合

由于正则表达式极为灵活,当然可以继续组合不同的符号以达到不同的效果

表达式不匹配不匹配说明
^[A-E0-4]Center01
234567
Abcdefgh
center
667788
Fake
开头为 A、B、C、D、E、0、1、2、3、4 的段落
[D-G5-7X-Z]$whatever6
112233Z
1230000Y
6whatever
Zcenter
123000
结尾为 D、E、F、G、5、6、7、X、Y、Z 的段落
^[1-37-9]$1
3
8
ca12
356
89asd
包含单一字符 1、2、3、7、8、9 的段落

无限重复匹配符 + 的使用

有些时候需要对一个规则反复在段落中进行匹配,这时可以使用无限重复匹配符 +,+ 代表这个规则匹配到一次或更多。如 [0-9]+ 则会匹配 3 或 356721011024,如果需要提取数字如电话号码等则可以使用这个符号,该符号建议和 ^、$ 等符号组合使用,并且在测试本符号时建议使用 grep -o 来只显示出匹配的内容。

表达式匹配匹配说明
^[0-9]+$13800138000
5
12739123817
Internet114514
cyber123
wolf
匹配只包含 0、1、2、3、4、5、6、7、8、9 且重复一次或以上这些数字的段落
^[A-Za-z]+$Internet
network
iNtErNationAl
K
S
internet123
543network
inter123net
匹配只包含 A-Z、a-z 且重复一次或以上的段落
^[A-Z0-9]+$A3CC5ESS1
EXC456EL
3
ASD
access123
ExCel
匹配只包含大写字母或数字或混合的段落

限定重复次数符 {}

当有些时候只想匹配重复制定次数的规律的时候,则可以使用 {} 来限定重复多少次。如只希望规律重复 11 次时,则可以使用 {11} 来限定。如希望匹配规律重复不大于 5 次,则可以使用 {,5}。如希望规律重复 8 次或以上,则可以使用 {8,}。如希望规律重复 5 – 10 次,则可以使用 {5,10}。

表达式匹配匹配说明
^[0-9]{11}$01239876541
67194815681
123456
1
匹配重复11 次数字的段落
^[E-G]{,4}$EFF
E
EF
GGEE
EEEFF
ABCDE
ABC
EEEEEE
匹配 E、F、G 且只重复 4 次或以下(最低限度为 1 个)的段落
^[a-zA-Z0-9]{5,}$hello
world1news
weLcome2HEre
114514
hi
11
abc
4514
匹配所有数字字母且重复 5 次或以上的段落
^[a-z]{3,7}$admin
root
sysadm
administrator
sa
sysadmin
123456
匹配小写字母 a 到 z 且重复 3 至 7 次的段落

分组符 ()

有些时候需要匹配一些复杂的规则,这时可以用分组符来代表不同匹配的部分。
如在处理 csv 文件时,文件格式如下:
abcdefg,123456
hello,95
center,100049
我们想匹配这两部份,则可以用 ([a-z]+),([0-9]+),这样匹配成功之后就可以用 \1 代替第一部分,\2 代替第二部分,供文字处理使用。
分组符也可以用于多个连续的规则使用,如我想匹配:
HaJcKeUvPo,规则是一个大写字母紧跟着一个小写字母,这时就可以使用 ([A-Z][a-z])+ 来进行匹配

表达式匹配匹配说明
^([A-Z][a-z])+$CeShWeNbEn
SaGeErWaNg
XiAoXiOnGwEiNi
CeshiWenben
weinixiong
SaGeErWang
匹配符合一个大写字母紧跟着一个小写字母的段落
^([A-Z][0-9]){4}$A1B2C3D9a0c9u3j4
A1B2C3D4E5
匹配符合一个大写字母紧跟着一个小写字母且此规则只重复 4 次的段落

或许存在符 ?

有些时候,一个规律可能存在也可能不存在,这时候就需要使用 ? 来代表一个匹配 0 或 1 次。举个栗子:如果想匹配一堆英文字母和一堆英文字母后面一堆数字(也可能没有)的段落,则可以使用 ? 来进行匹配(^[A-Za-z]+([0-9]+)?$)。

表达式匹配匹配说明
^([a-z]+)([0-9]+)?$internet1234
helloworld
internet!@#$
1234inter
包含小写字母重复一次或更多且可能存在数字重复一次或更多的段落
^([A-Z][a-z]([0-9])?)$XiXi1HaHa2
XiXi2HaHa
XiXi1HaHa234包含一个大写字母紧跟着一个小写字母或许紧跟着一个数字的段落

任意单一字符 .

一个点(.)代表匹配任意单一的字符,如:^[A-Z].[a-z]$,则可以匹配:A3x、B!d,但不能匹配A33x、Bd。

或许存在或更多 *

这里的 * 相较于 ?,则可以匹配多次的。举个栗子:^[A-Za-z]+[0-9]?[A-Za-z]+$ 和 ^[A-Za-z]+[0-9]*[A-Za-z]+$ 有什么区别呢?

前者可以匹配 “HelloWorld”、“Hello9World” 但不能匹配 “Hello987World”,而后者则可以匹配 “HelloWorld”、“Hello9World” 和 “Hello987World”。

练习

光看是没用的,需要练习才可以更加深入的理解。

建议使用 https://regexone.com/ 进行练习。

]]>
https://blog.yandere.moe/moe/regex101/269.html/feed 1
扫盲IPFS的使用 https://blog.yandere.moe/moe/ipfs/252.html https://blog.yandere.moe/moe/ipfs/252.html#comments Sun, 07 Oct 2018 16:29:44 +0000 https://blog.yandere.moe/?p=252 IPFS 是一个新鲜事物,虽然早在 2014 年就已经发布,也一直有关注它。直到最近 CloudFlare 建设了 IPFS 的节点后觉得应该写一篇关于 IPFS 的文章了,不然博客咕了 2 个月没更新也不太好。

IPFS 的官方网站在 https://ipfs.io/,在其官方网站上有介绍到其主要特性,其中一个最吸引我的特性是“IPFS removes duplications across the network.”,也就是去重功能。

试想一下 Torrent 下载也是属于 P2P 网络下载,但是其有一个不好的地方就在于文件的任意一个字节被修改,就需要重新做种,这就造成了极大的资源浪费,而 IPFS 天生就可以避免重复的资源浪费。

这是如何实现的呢?

首先,IPFS 并不存储文件,而是将文件打散后分为一个个“区块”(block),再存储这些区块的内容。而文件则是一个个 block 的 reference,将这些 references 重新拼接在一起就成为了一个可以读取的文件。

而根据这篇问题,IPFS 的区块大小是 256 KB,也如同问题所说,如果将一个文件切割成一半,加些东西进去,IPFS 只会存储另一半没有在网络上出现的部分,已存在的部分不需要重新上传,所以去重成功完成了。

下载及安装:

可以到 IPFS 的官方网站下载并安装,Linux 用户可以直接用包管理器安装,能打开本站点的应该都有能力完成这一步,就不多说了。

使用:

安装好 IPFS 之后,需要对其进行初始化,然后创建节点私钥之类的,使用 ipfs init 命令即可完成创建。在默认情况下,IPFS 会创建一个 2048-bit RSA 钥匙对,不过你也可以选择自定义长度,在这里我将使用 4096。所以初始化的命令为 ipfs init --bits 4096

初始化成功后,会得到如下输出

ipfs init --bits 4096
initializing IPFS node at /home/yanderemoe/.ipfs
generating 4096-bit RSA keypair...done
peer identity: QmYu**********************************MTLA

其中,“peer identity”为你的节点地址。

运行 IPFS,输入 ipfs daemon 命令来运行一个 IPFS 节点。

$ ipfs daemon
Initializing daemon...
Successfully raised file descriptor limit to 2048.
Swarm listening on /ip4/**.*.*.*/tcp/4001
Swarm listening on /ip4/127.0.0.1/tcp/4001
Swarm listening on /ip4/**.***.**.***/tcp/4001
Swarm listening on /ip6/::1/tcp/4001
Swarm listening on /p2p-circuit/ipfs/Qm*******************************************MTLA
Swarm announcing /ip4/**.*.*.*/tcp/4001
Swarm announcing /ip4/127.0.0.1/tcp/4001
Swarm announcing /ip4/**.***.**.***/tcp/4001
Swarm announcing /ip6/::1/tcp/4001
API server listening on /ip4/127.0.0.1/tcp/5001
Gateway (readonly) server listening on /ip4/127.0.0.1/tcp/8080
Daemon is ready

Daemon is ready 说明了节点运行成功,现在你可以使用 IPFS 获取网络上的资源了。

假设你知道一个 IPFS 资源,想获取它,那么可以使用 ipfs cat 命令。

比如我知道 QmebCzFGo6TnYj8hvexCc2D9xHeFcQXdBu31c5qL5ASJbw 这个 IPFS 资源,就可以使用

ipfs cat QmebCzFGo6TnYj8hvexCc2D9xHeFcQXdBu31c5qL5ASJbw > output.jpg 来下载它,下载的结果会被保存在 output.jpg 中。现在,试试吧。

如果成功了,你应该能看到 output.jpg 是一只可爱的二哈。

如果想上传一个文件,就可以使用 ipfs add 来运行,比如我想上传一个名为“Frustrated Husky.mp4”的文件,就需要执行 ipfs add "Frustrated Husky.mp4"

ipfs add "Frustrated Husky.mp4"
added QmYZo6yQH1bYYYtQ1wvtyfinXufpnKYED18eG4QrFr3DGi Frustrated Husky.mp4
1.86 MiB / 1.86 MiB [=================================================] 100.00%

其中 QmYZo6yQH1bYYYtQ1wvtyfinXufpnKYED18eG4QrFr3DGi 就是这个资源的 IPFS 地址啦,其他人也可以通过这个来访问它。

添加目录:

和添加文件一样,只是需要 ipfs -r folder_name 来 recursive add 资源。

如:ipfs -r moe-site

ipfs add -r moe-site/
added QmYZo6yQH1bYYYtQ1wvtyfinXufpnKYED18eG4QrFr3DGi moe-site/Frustrated Husky.mp4
added QmQeKrEHr9DcCvEJynd3zDzbVAcTmzQFJ9jBrmLDBD9HgT moe-site/Golden Retriever and Cat.mkv
added QmYeie5dNtfsYprQwcMX7H7deH97QUKZQx8PRmSLdwk4WW moe-site
3.35 MiB / 3.35 MiB [=================================================] 99.88%

如果你希望动态更新内容,则需要添加一个目录进去。

缓存资源:

当你上传了一个资源之后希望别人也能下载,就需要在公共节点或一个服务器上来缓存它,其中比较有名的是 CloudFlare 的 IPFS 节点和 IPFS.io 的节点。

通过:

https://cloudflare-ipfs.com/ipfs/QmYZo6yQH1bYYYtQ1wvtyfinXufpnKYED18eG4QrFr3DGi

https://ipfs.io/ipfs/QmYZo6yQH1bYYYtQ1wvtyfinXufpnKYED18eG4QrFr3DGi

可以使文件被传送至公共节点,这样即使你下线了别人也可以访问到这个文件。

IPNS:

由于每个文件都有唯一的 hash,每次更新都会导致文件 hash 改变,从而 IPFS 的资源地址也会改变。那么该如何动态更新一个资源呢?很不幸,资源没办法被动态更新,但是,你可以更新指向资源的指针。这里就要介绍下 IPNS 的使用了。

回到上面添加目录的例子,从标粗的黑体字可以得知目录的 IPFS 资源名为“QmYeie5dNtfsYprQwcMX7H7deH97QUKZQx8PRmSLdwk4WW”,这就是你的 IPNS 不变的地址了,当你想要更新内容,只需要修改好内容,然后执行

ipfs name publish QmYeie5dNtfsYprQwcMX7H7deH97QUKZQx8PRmSLdwk4WW

重新发布,这样其他用户就可以看到当前版本的目录了。

是不是很像 git?

试试它吧。

]]>
https://blog.yandere.moe/moe/ipfs/252.html/feed 4
修改华为无线网卡的 IMEI 串号 https://blog.yandere.moe/moe/modify-huawei-modem-imei/243.html https://blog.yandere.moe/moe/modify-huawei-modem-imei/243.html#comments Sun, 05 Aug 2018 05:34:19 +0000 https://blog.yandere.moe/?p=243 说到 IMEI 码,有一些经验的人可能会知道这是一个全球唯一的移动设备识别序列号,这个号理论上在全球范围内都是唯一的,但是也有例外,比如销往印度的中国产山寨机,它们的串号就为15 个 0。至于为什么要修改它?有时候运营商会做机卡绑定,即你的卡只能用在这个手机上,否则就会失去优惠或干脆无法使用。当然,如果你有特殊的需要,也需要修改这个 IMEI 码。

众所周知,基于高通(Qualcomm)芯片的 IMEI 是出了名的难改,不像 MTK 那样开工程模式就直接任意修改了。然而不幸的是,华为 4G 无线网卡用的也是高通的芯片。

起初以为用 Google 使用英文搜索如何改 IMEI 号就可以很轻易的找到方法,然而事实并不是这样的。很多英语国家修改 IMEI 是违法行为,因为这助长了手机盗窃(国外很多国家运营商会封锁被盗手机的 IMEI,这样即使换卡也无法使用)。

不过,这可难不倒隔壁的战斗民族,毕竟他们是和 KGB 斗志斗勇过的。在这篇帖子中的第 2336 楼中,牛人给出了具体的方法。

我用手头的华为 4G 网卡(型号:E392u-12)测试了一下,还真的可以用。

首先将你的无线网卡插入电脑的 USB 口,过大概 10 秒等初始化完成之后看 dmesg 的消息:

[ 6926.771830] option 1-1:1.0: GSM modem (1-port) converter detected
[ 6926.771996] usb 1-1: GSM modem (1-port) converter now attached to ttyUSB0
[ 6926.772159] option 1-1:1.1: GSM modem (1-port) converter detected
[ 6926.772273] usb 1-1: GSM modem (1-port) converter now attached to ttyUSB1
[ 6926.772411] option 1-1:1.2: GSM modem (1-port) converter detected
[ 6926.772526] usb 1-1: GSM modem (1-port) converter now attached to ttyUSB2

从这里我们可以看到 3 个 tty 接口。首先要找到 AT 指令接口。你可以使用 screen /dev/ttyUSB 115200 后输入 “AT” 命令看回显。

首先试 ttyUSB0:

screen /dev/ttyUSB0 115200

之后输入 “at”(不含单引号),之后回车(输入的时候没有回显)。

如果这是一个接受 AT 指令的接口,那么它会返回 “OK”。

很幸运,一下就猜对了。

之后来获取当前的 IMEI 号,在下一步需要。

指令为 “AT+CGSN” 输入的时候还是没有回显,回车会出现当前的 IMEI 号,之后记录下来。

8xxxxxxxxxxxxx1

之后是关键的一步,计算解锁密码。

你可以选择使用在线版的:https://tools.yandere.moe/huawei_code_calculator/

或者 clone 到本地用:https://raw.githubusercontent.com/yanderemoe/huawei_modem_code_calculator/master/calculator.php

我们需要的解锁码是 Unlock (V2) 的码,并使用它来解锁 nvram 的 IMEI 分区所以我们可以修改它。

解锁的指令是

at^datalock=码

比如你的解锁码是 123123,那么指令是”at^datalock=123123″(仍然没有回显)。

将“at^datalock=123123”输入到 ttyUSB0 (上文提到的 AT 指令接口),之后回车,如果返回给你

+CME ERROR: 16

则失败,原因是码错误,再次确认下(要计算的 IMEI 不是印在网卡上的,而是通过上面指令读到的)

如果提示OK则成功。

之后需要 nvram 写入程序,战斗民族牛人 forth32 已经写好了放在 gayhub 上了,我也 fork 了一份。

clone 代码到本地:

git clone https://github.com/yanderemoe/qtools

然后 cd 进去使用

make

编译,完成之后,你会发现多一个可执行文件 “qnvram”,这个就是用来写网卡 IMEI 的程序了。

对了,还记得上面有 3 个 ttyUSB 吗?我们已经知道了 ttyUSB0 是接受 AT 指令的,那么其他两个哪个是接受写入指令的接口呢?其实也没必要知道,反正还剩两个,一个一个试试呗?

修改的指令是:

./qnvram -j 新的串码值 -p /dev/ttyUSBX

新的串码值需要 15 位,最后一位为校验码。

你可以通过在线生成工具随机生成一个合法的 IMEI 值,或者干脆改成 15 个 0(因为特殊国情(山寨机)中国没有对空 IMEI 进行入网检查)。

试试

./qnvram -j 000000000000000 -p /dev/ttyUSB1

返回了

--- Ошибка записи ячейки 0226 ---

虽然看不懂,但是最后说 0226,就是错误了。

那试试 ttyUSB2?

./qnvram -j 000000000000000 -p /dev/ttyUSB2

没有任何回显,这代表修改成功。不信你回到上面的 AT 指令接口上再执行下 “AT+CGSN” 查看一下?

回显变成了 “000000000000000”,修改成功。

]]>
https://blog.yandere.moe/moe/modify-huawei-modem-imei/243.html/feed 2
使用 Bus Pirate 读写 EEPROM 芯片 https://blog.yandere.moe/moe/bus-pirate-eeprom/226.html https://blog.yandere.moe/moe/bus-pirate-eeprom/226.html#respond Sun, 01 Jul 2018 03:36:05 +0000 https://blog.yandere.moe/?p=226 又是好久没更新博客啦,其实最近一直在做一些折腾项目。本来是在玩路由器,然后刷机刷挂了,就想起来了买过来好久也没用的 Bus Pirate,之后用 Bus Pirate 作为芯片的编程器成功复活了路由器,虽说最后是把路由器复活了,但是中途踩了很多坑,所以记录下方便自己也方便后人。

首先啥是 EEPROM?

EEPROM 英文叫“electrically erasable programmable read-only memory”,直译呢就是“电子擦写可编程只读内存”,与其相对的是 EPROM(erasable programmable read-only memory)还有 PROM(Programmable read-only memory)。虽然它们叫“内存”,但是别搞错了,它们在断电之后并不会丢失数据(非易失),所以如果还是不太理解德话,你可以认为它们为“硬盘”。

他们有啥区别?

最容易分辨的是 EPROM,就它长得不一样,因为要擦除 EPROM,就需要将其放在紫外线灯下照射一段时间(大概 1 – 2 小时左右),所以它有一个透明的位置用于接收紫外线。

之后就是 PROM,这个应该是最原始的或者那种生产之后再也不修改内容的芯片,因为它只能被编程一次。至于为什么只能被编程一次,这就是物理方面的话题了。

一个空白的 PROM 所有的 bit 都为 1,当你编程它的时候就把 bit 为 0 的地址的保险丝烧断,这样被烧断的部分就读取出来为 0 了。由于编程是把保险丝烧断,所以这是一个不可逆的过程,所以它只能被编程一次(较真的朋友会想物理上再接上让它再复原,虽然理论可行,但是这会是一个非常非常非常昂贵的操作,还不如买个空白的新的)。

一般 PROM 用于游戏卡带等以后不需要修改的产品中。

最后是 EEPROM,也就是本文的重点部分了。

EEPROM 多用于路由器、机顶盒、手机之中,因为它需要被可以很容易的修改。不然路由器每次插上电就要重新设置一次,机顶盒重启一次就要重新搜台,手机换电池什么都没了谁受得了。

EEPROM 可以通过指令来进行各种操作,如开关写保护(通过电路 + 或 – 来给指令),写模式、读模式等。

路由器的固件和用户的设置是存放在 EEPROM 中的,如果路由器刷机刷坏了就类似于电脑操作系统弄坏了,无法启动。

要读写它,首先就需要确定哪个是 EEPROM,下面是一个路由器的版面图。

而这个路由器上的 EEPROM 芯片就在左上方的 8 pin 芯片上。

如果没有经验的话可能无法一眼看出哪个是 EEPROM 芯片,这时可以用最简单的方法:查芯片编号。

如果仔细看那块芯片的话,可以看到上面写的是“F16-100HIP”,之后 Google 搜索一下就能搜到 Data Sheet,然后就会发现这是“16 Megabit Serial Flash Memory with 4Kbytes Uniform Sector”,就是这块了。

然后利用测试夹夹住芯片,测试夹应该会有个红色的线(如下图),红色的线就是对着芯片的一个带圆圈的角上(如下图)。

夹好之后是这样的:

芯片这头弄好之后该连接它到 Bus Pirate 了,将豁口对着左面,红线应该在上面。

Pinout 应该是:

8   1

7   2

6   3

5   4

如果不确定的话用万用表测量一下母头与夹子的位置关系。

然后按照如下方式连接:

母头 Pin -> Bus Pirate

1 -> CS

2 -> MISO

3 -> +3.3V Write Protect(ed)

4 -> GND

5 -> MOSI

6 -> CLK

7 -> +3.3V

8 -> +3.3V

关于 Pin 3,是写保护,每个芯片的行为可能不一样,有的是连接到 3.3 V 是写保护,有的是连接到 GND 是写保护,具体需要看 Data Sheet。

连接好之后执行命令:
flashrom -p buspirate_spi:dev=/dev/ttyACM0

其中的 ttyACM0 是当前设备的,用 dmesg 就可以看到。

可以看到目前芯片已经检测到了,是“EN25F16”型号的。之后就可以用 -r 指令读取或 -w 指令写入了。

踩过的坑:

  1. 夹子触点接触不良,这会导致检测不到芯片,晃晃或者看下触点齐不齐,不齐的话拌齐。
  2. 一用 Flashrom 就会导致 Bus Pirate disconnected,这是 Bus Pirate 固件的 bug,需要升级到 6.2 或以上版本的固件。
]]>
https://blog.yandere.moe/moe/bus-pirate-eeprom/226.html/feed 0
OpenWrt 的前世今生 https://blog.yandere.moe/moe/story-behind-openwrt/217.html https://blog.yandere.moe/moe/story-behind-openwrt/217.html#comments Sun, 06 May 2018 02:55:42 +0000 https://blog.yandere.moe/?p=217 前几天在读新闻的时候发现了一则有意思的标题“因为违法使用开源资源,他们不仅要道歉还要赔钱! ”,大概内容讲了中国的一家公司(原告公司)因为被告公司抄袭了使用 GPL 授权的软件但是不开源而提起的诉讼。这个新闻能引起我的兴趣是因为早在 2011 年的时候,北京的一家法院就裁定违反 GPL 协议并不会有什么法律后果,而 7 年过去了,同一个地区的法院对违反 GPL 的行为给予了法律上的后果

说起类似的案例,我想起国外 GPL 保护机构,如:gpl-violations.org 等早在 2005 年前后就对 Fortinet、D-Link 等公司进行了针对违反 GPL 的诉讼,并成功在德国等国家的法院上获得支持,从而迫使这些公司对其使用的 GPL 部分软件实施开源。

既然文章的标题是关于 OpenWrt 的,那么不得不提起 Linksys 公司生产的 WRT54G 型号路由器。它发布于 2003 年。而要知道,在 2003 年的时候,网络设备生产厂商的硬件固件都是私有闭源的天下,而在那时候 Linux 对无线网卡的支持也不算太好,而那时候一个可以自己定制软件甚至添加功能的路由器几乎不可想象,即使有也会贵的离谱。毕竟厂商这样就可以生产更多的 $$$$$ (家用网关? 50 刀, 高端路由器? 200 刀,带网址过滤等高级功能的家用网关?你在说防火墙吧?对不起,少于 500 刀没有。)

而多亏了 GPL 协议,Linksys 公司开放了其路由器 WRT54G 型号的内核源代码,从而使早期的 OpenWrt 和其他类似项目的存在成为可能。

在西四时区(UTC -04:00)的 2003 年 6 月 7 日 22 时 41 分 23 秒,一位名叫 Andrew Miklas 的 Linux 用户在内核邮件列表中发表了一篇标题叫“Linksys WRT54G and the GPL”的邮件,内容大致译文如下:

一段时间之前,我提到了 Linksys WRT54G 无线访问点(AP)在其固件中使用了许多 GPL 的项目,但是看起来并没有任何原始码可供下载,或注明了 GPL 软件的使用。4 周之前,我和一个 Linksys 的雇员聊过天,这名雇员确认了 Linux 在其产品中的使用,并且提到了他会和管理层做一些工作使源代码被公开。不幸的是,我在过去 3 周的时间中给此人发的 Email 都没有被答复。 当然了,我也给他们常用的 Email 地址(pr@linksys.com、mailroom@linksys.com)发了邮件,不过也都没有回复。
好吧,对于我来说,我很难去知道这家公司只是进行了 3 周的假期(并且没有设置邮件自动回复),还是他们被要求不回复关于此问题的邮件。另外,我应该说明我并不拥有这款产品,所以我无从知晓是不是源代码和产品被放在了一起(包装盒中)。
不过无论如何,我尝试在 Linksys 网站中搜索了所有可用的信息,但是没有任何关于 GPL 和 Linux 的标注,或者这款产品的固件源代码。同样,固件的二进制(binary)在他们网站上供任何人自由下载,但是并没有下载源代码的链接。最后,或许很奇怪在包装盒中会有源代码,因为我一开始联系 Linksys 他们并不知道 Linux 被在此产品中使用。

以下是我检测出可能的 GPL 违反的测试步骤:
1. 到 URL:http://www.linksys.com/download/firmware.asp?fwid=178 (作者注:已不存在,但是通过网页时光机抓的缓存中可以看到。)

2. 下载“固件升级文件”,ftp://ftp.linksys.com/pub/network/WRT54G_1.02.1_US_code.bin,(MD5SUM: b54475a81bc18462d3754f96c9c7cc0f)

3. 在等待下载的过程中,确认在此网页上没有任何提到关于此二进制包包含 GPL 的内容。

4. 下载完毕后,从 0xC0020 开始将文件提取到另一个文件上(dd if=WRT54G_1.02.1_US_code.bin of=test.dump skip=24577c bs=32c)。

5. 请注意,这会是一个 CramFS 文件系统的镜像。挂载它。

6. 探索这个文件系统中的文件,你会发现它的系统是基于 Linux 2.4.5 的。

7. 这个 Linux 内核(我认为) bin/boot.bin 和其他的一堆东西混杂在一起了。

不过,你或许会想问我为什么对获得这款设备的源代码感兴趣?

很多讨论都说 Linux 缺少对大部分更新的 802.11b 和(几乎?)所有的 802.11g 芯片。哦,顺便说,Linux 对至少一个无线芯片厂商的芯片有非常好的支持,下面的 Broadcom 无线芯片看起来都被 Linux 所支持。(如果 MIPS 架构的 Linksys 的路由器运行着 Linux。)

Broadcom BCM4301 Wireless 802.11b Controller
Broadcom BCM4307 Wireless 802.11b Controller
Broadcom BCM4309 Wireless 802.11a Controller
Broadcom BCM4309 Wireless 802.11b Controller
Broadcom BCM4309 Wireless 802.11 Multiband Controller
Broadcom BCM4310 Wireless 802.11b Controller
Broadcom BCM4306 Wireless 802.11b/g Controller
Broadcom BCM4306 Wireless 802.11a Controller
Broadcom BCM4306 Wireless 802.11 Multiband Controller

上述列表提取于 lib/modules/2.4.5/kernel/drivers/net/wl/wl.o 的字符。

……

在下面的回复中,用户 Dave Jones 提到了

好奇的是,Belkin 的产品同样看起来是基于同样的源代码的。看起来非常像重新包装的固件并禁用了一些功能。

……

用户 Colm MacCárthaigh 提到了

…..

我买了一个 Dell TrueMobile 1184 访问点/路由器,我用 root 用户名和密码 admin 登录了 telnet,发现它在运行 armlinux。

# cat /proc/version

Linux version 2.2.14-v1.9 (root@localhost.localdomain) (gcc version
2.9-vLinux-armtool-0523) #5357 Sat Jan 25 17:39:42 CST 2003

# cat /proc/cpuinfo
Processor : S3C4510/SEC arm7tdmi rev 0
BogoMips : 44.24
Hardware : <NULL>

也有很多其他的 GPL 的软件,如 ipchains, busybox 和其他你能想得到的。

在对 /etc/hosts 文件进行了一下 grep:

# cat /etc/hosts

127.0.0.1 vLinux/Vitals_System_Inc.

然后找到了一个网站:

http://www.vitalsystem.com/

并且

http://www.onsoftwarei.com/

看起来是支持 vLinux 的公司。

…..

然后我联系了 Dell 公司,并被转接到法务部门,我发给了他们一封信:

http://www.redbrick.dcu.ie/~colmmacc/TrueMobile-1184/dell.letter (作者注:已不存在,不过可以看缓存页面。)

6 周后,我免费得到了一个包含源代码的 CD 磁碟和一封很好的信:

hxxp://www.redbrick.dcu.ie/~colmmacc/TrueMobile-1184/dell.jpg (已不存在,但是缓存仍在。)

…..

这个代码是一个有着 2.2.14-rmk4 补丁的 Linux 2.2.14,没什么特殊定制的,不过现在我有了这个配置文件,并可以编译一个支持 IPv6 的内核。

…..

Dell 称他们会审查他们的流程以确保这种问题不再发生,Dell 法务部门称他们的供应商并没有告知他们关于许可证的问题。现在,Dell 会在 TrueMobile 包装中附带源代码 CD 和许可证。Dell 做的真的很好。这是一个如何做正确的事的例子。

……

10 天后,原始作者 Andrew Miklas 再次回复了这个主题

我收到了 Linksys 的反馈,他们正在确定什么东西必须被在 GPL 许可证下开源。我会保持更新。

我在 Linksys 的联络人称此公司有支持 Linux 的传统,在此之前,他们将源代码光碟和产品放在一起。我被告知这次 WRT54G 缺少源代码是一次非故意的孤立的意外事故。

….

时间一转眼过了 3 个月,在 9 月 28 日的时候,作者 Andrew Miklas 在内核邮件列表中发表了主题为“Linksys WRT54G: Part 2”的邮件,大概意思是:

….

Linksys 在其 GPL Center 中释出的源代码是不全的,与源代码释出的内核有静态链接的文件并不存在于源代码之中。

….

很明显,释出的内核并不能被编译,因此,这还是违反了 GPL 协议。

….

此事一出,Linksys 公司的态度被很多人所了解了,也有律师对 Linksys 的法务部门一次又一次发了律师函,但是 Linksys 还是雷打不动。

用户 Rob Landley 的观点是:

Linksys 并没有或者不知道这些固件的源代码。

在我所工作过的公司中,只有少部分工程师知道这些内核的东西,而这些工程师通常在产品研发结束后就离开了,技术支持们可能不会知道这些。而管理层通常很少注意有多少是需要知道的。

继续给他们压力,be nice,给他们一些时间去检查他们的代码库。

固件的开发或许是外包给印度或者台湾来完成的。

….

最后,在各大社区的压力下,Linksys 终于开源了他们的固件代码。

就在开源之后 1 年不到的时间,Gerry Rozema (aka groz) 和 Mike Baker (aka mbm/embeem) 成立了 OpenWrt 项目组。

起初,OpenWrt 仅支持 WRT54G,之后逐渐支持了其他的嵌入式设备。

2016 年 5 月份,OpenWrt 核心开发者们互相出现了歧义,并导致大部分开发者 fork 了成为新的项目 LEDE,在 2018 年 1 月份,OpenWrt 与 LEDE 开发者们达成了协议,并将 LEDE merge 回 OpenWrt。在下一个版本将改回 OpenWrt 的名字。

截至目前,OpenWrt 官方已经支持 1000 多款嵌入式设备了,将自由还给了终端用户。

参考资料:

https://en.wikipedia.org/wiki/OpenWrt

http://www.wi-fiplanet.com/tutorials/article.php/3562391

https://hardware.slashdot.org/story/03/07/06/2121234/linksys-releases-gpled-code-for-wrt54g

]]>
https://blog.yandere.moe/moe/story-behind-openwrt/217.html/feed 5
一些简单的逻辑闸和逻辑运算 https://blog.yandere.moe/moe/logicgate/209.html https://blog.yandere.moe/moe/logicgate/209.html#respond Mon, 26 Mar 2018 03:34:25 +0000 https://blog.yandere.moe/?p=209 作为 Cheat Sheet 来使用。

先从常见的逻辑闸开始:

AND:当所有 Input 为 True 时,返回 True,否则 False。

Input Output
0 0 0
0 1 0
1 0 0
1 1 1

OR:只要有一个 Input 为 True,就返回 True。

Input Output
0 0 0
0 1 1
1 0 1
1 1 1

NAND:非 AND,和 AND 相反。

Input Output
0 0 1
0 1 1
1 0 1
1 1 0

NOR:非 OR,和 OR 相反。

Input Output
0 0 1
0 1 0
1 0 0
1 1 0

XOR:异或(exclusive-OR),输入值只能有一个是 True,才会返回 True。

Input Output
0 0 0
0 1 1
1 0 1
1 1 0

XNOR:非异或,和 NOR 相反:

Input Output
0 0 1
0 1 0
1 0 0
1 1 1

NOT:非

Input Output
0 1
1 0

一些运算规则:

De Morgan’s laws

(当遇到混乱的一堆 Logic gates 的时候,可以用这个定律来化减,这样链接电路的时候方便点)

 

Mask:

假设你有一串二进制 01100010,你想让第 3 位(从 0 开始计算)的 bit 变成 1,但又不改变其他的 bit,该怎么办呢?

应用一个 mask( | 1000):

01100010 | 1000 = 01101010

使用 OR 操作,如果 mask 在原始二进制中遇到 0,则保留 0。如果遇到 1,则保留 1(1 OR 0 = 1)。

在 C 语言中:

ORIG |= (1 << 3);

如果想将第 5 位的 bit 变成 0,则用 AND mask:

01100010 & 011111 = 01000010

(0 & 1 = 0,1 & 1 = 1)

在 C 语言中:

ORIG &= ~(1 << 5);

解释下:

(1 << 5) 是 100000,

~(100000) = 011111

ORIG & 011111

其实这篇文章是和上一篇《方波(Square Wave)的一些基本概念》有联系的哦。

]]>
https://blog.yandere.moe/moe/logicgate/209.html/feed 0
方波(Square Wave)的一些基本概念 https://blog.yandere.moe/moe/squarewaves/198.html https://blog.yandere.moe/moe/squarewaves/198.html#respond Sun, 04 Mar 2018 03:28:20 +0000 https://blog.yandere.moe/?p=198 一些基本的物理定律和公式,为了一个要用到 Arduino 的项目做铺垫。

在电子的世界中,一切内容都是通过 0 和 1 的表达而实现的,而方波作为一个要么正要么负的波类型用来传播数据自然是最佳选择了。而除了方波之外,还有 Sine 波、三角波(Triangle)、锯齿波(Sawtooth)。

而有自己组装电脑经验的童鞋们可能会知道:如果硬件自检不通过的话,为什么主板上的蜂鸣器会发出刺耳的滴滴滴的声音而不是用多国语言说:“您好,您的内存自检失败。”,这是因为主板上的蜂鸣器作为一个非常便宜并且容易制造的扩音设备来讲,其只能发出方波(Square Wave)。而发出方波的方法又非常简单:只需要在指定的一段时间(Period)内(1 秒)给电压 N 秒然后不给电压同样的 N 秒,就可以使蜂鸣器震动而产生声音。

方波是有明显的间隔的。以上图为例:一个是正部分(positive half),一个是负部分(negative half)。而正部分 + 负部分则是完整长度,正部分 = 负部分。

如果想制造一个方波,你只需要 Frequency(频率、单位为赫兹(Hz))即可,根据公式

Frequency = 1 / Period。

假设你想制造一个 440 Hz 频率的方波,那就把 440 作为 Frequency 写入公式:

440 = 1 / Period

440 * Period = 1

Period = 1 / 440

如果上面的公式是正确的话:也就是说在 1 秒的间隔内,加电压 Period 时长,去电压 Period 时长,即可获得你想要的频率。

等等……还记得上面所说的方波是有正部分和负部分的吗?所以你还需要将 Period / 2 才可以。

所以是:

while(1){

给电压 (1 / 440 / 2) 秒;

去电压(1 / 440 / 2)秒

}

不过如果你想直接把上面的伪代码写到 Arduino,就会发现得到的声音并不会完全等于你想要的频率,因为 Arduino 库的 digitalWrite 是有延迟的,以后的文章中会讲到如何直接写入电压到 ATmega328(Arduino 所用的芯片) 端口上。

]]>
https://blog.yandere.moe/moe/squarewaves/198.html/feed 0
ElasticSearch 折腾小记 https://blog.yandere.moe/moe/elasticsearch/179.html https://blog.yandere.moe/moe/elasticsearch/179.html#comments Mon, 15 Jan 2018 01:11:42 +0000 https://blog.yandere.moe/?p=179 把服务器修好之后环境也都重新配置了下,其中一个数据源需要做索引,之前一直用的 Sphinx,但是性能感觉不太好。在哥们的推荐下尝试了一下 ElasticSearch,配置是麻烦了点但是总体感觉还不错,并且成功实现了一元分词。

需求是有一个数据表,有如下字段:id、name、author、date、serialnum、location、telephone。id 字段是这条数据的唯一 ID,其他字段有些是纯数字,有些是汉字和数字和英字混合。必须要做到可以模糊匹配任何字段,以及多条件字段匹配。

测试数据如下:

id name author date serialnum location telephone

1,测试A,作者A,20180101,AFA9939FABBA93,韩国首尔市江南区베스트웨스턴프리미어호텔B104,821012345678

2,测试B,作者ASD,20140506,EFJBJAI91984,中国北京市朝阳区飘HOME连锁酒店405,861062345678

3,测试C,作者ADDDD 作者BDASD 作者CDAF, 20160511,ELAKJF92818449FA,美国加利福尼亚州洛杉矶市Downtown103,12345679876

查询 1:호텔 期待返回:ID 1

查询 2:5678 北京 期待返回:ID 2

查询 3:JAI9198 期待返回:ID 2

查询4:者BDAS 期待返回:ID 3

本来想吧,直接把数据用 Logstash 导入到 ElasticSearch,结果试了一下发现不行,没办法完成期待的查询。然后 Google 了一圈发现没有太好的配置,没有这么奇葩的分词方法的。看了下官方文档最后弄明白了,不得不说 ElasticSearch 的文档好差劲啊。


curl -XPUT 'localhost:9200/infomationtest1?pretty' -H 'Content-Type: application/json' -d'
{
"settings": {
"analysis": {
"analyzer": {
"ngram_analyzer": {
"tokenizer": "ngram_tokenizer"
}
},
"tokenizer": {
"ngram_tokenizer": {
"type": "ngram",
"min_gram": 1,
"max_gram": 999999,
"token_chars": [
"letter",
"digit"
]
}
}
}
},
"mappings": {
"data": {
"properties": {
"name": {
"type": "text",
"copy_to": "kw"
},"author": {
"type": "text",
"copy_to": "kw"
},"date": {
"type": "text",
"copy_to": "kw"
},"serialnum": {
"type": "text",
"copy_to": "kw"
},"location": {
"type": "text",
"copy_to": "kw"
},"telephone": {
"type": "text",
"copy_to": "kw"
},"kw": {
"type": "text",
"analyzer": "ngram_analyzer"
}
}
}
}
}'

博客貌似没办法格式化 JSON,所以凑合看吧,或者放到 JSON Viewer 里。

这个意思是建立一个索引(index),然后定义一个 ngram_tokenizer,之后把所有的字段复制到(copy_to)kw 这个字段上,之后对字段 kw 进行 ngram 一元分词。因为不知道什么原因 ElasticSearch 把 _all 这个通配符给 deprecated 掉了。

查询的时候这样:


curl -XPOST 'http://localhost:9200/informationtest1/_search?pretty=true' -H 'Content-Type: application/json' -d '
{
"query": {
"bool": {
"must": [{
"term": {
"kw": "条件A"
}
},{
"term": {
"kw": "条件B"
}
},{
"term": {
"kw": "条件C"
}
}]
}
}
}'

先跑一段时间看看效果怎么样,折腾的好累。。。

]]>
https://blog.yandere.moe/moe/elasticsearch/179.html/feed 1
聊聊最近的硬件级处理器安全漏洞 https://blog.yandere.moe/moe/cpuisnotsecure/176.html https://blog.yandere.moe/moe/cpuisnotsecure/176.html#comments Mon, 08 Jan 2018 04:43:37 +0000 https://blog.yandere.moe/?p=176 最近一年,大大小小涉及底层硬件的漏洞相继被发现。从 Intel ME 连环爆出漏洞,再到几乎影响到所有 CPU 的 Meltdown 和 Spectre 漏洞,着实颠覆了我对漏洞的认识。以前总认为硬件漏洞是小说中才有的情节,没想到却实实在在发生在现实中。各路媒体对这些漏洞的报道一个比一个玄幻,总觉得应该写一篇关于这些漏洞的文章。希望本文可以帮助你了解这些漏洞,以及哪些漏洞确实对你有害。

首先从 Intel ME 说起。Intel ME 全称 Intel Management Engine,这个模块在 2008 年及以后出厂的 Intel CPU 中均有存在。这个模块能做到的事情可太多啦:对系统内存的完全访问、对网络适配器的访问、对各类设备的访问、开关机…。最重要的是,这个模块独立于 CPU 运行,甚至在你的电脑关机的情况下也在运行!

这个模块最初设计的作用是为了企业更好的管理其拥有的计算机资产,比如进行远程管理、KVM 访问等。可是由于这个模块固件并非开源的,而且还是经过未公开的算法压缩并混淆,甚至连完整的文档都没有(很多功能并没有在文档中),令人不得不怀疑这个模块实际上是个后门。

虽然这个模块的固件进行了大量的混淆处理,但是还是那句老话:没有密不透风的墙。终于在 2017 年 5 月份左右,安全研究员们一个接一个的发现这个固件存在的漏洞。

这些位于 Intel ME 的漏洞包含了:

CVE-2017-5689 (AMT)

CVE-2017-5705

CVE-2017-5708

CVE-2017-5711

CVE-2017-5712

注:下面提到的 AMT 是仅存在于支持 vPro 的硬件上,AMT 是基于 Intel ME 的。通常情况下,如果你的主板以及 CPU 支持 vPro,那么就支持 AMT。启用了 Intel ME 的 CPU 并不一定支持 vPro 以及 AMT。

Intel ME 的固件分为两种:一种是 1.5MB 大小的,即阉割版。另一种是 5MB 大小的,即完整版。

其中 CVE-2017-5705、CVE-2017-5711 的利用条件是需要一个本地的高权限用户或程序。

CVE-2017-5708 的利用条件是需要一个本地普通权限的用户或者程序。

而 CVE-2017-5712 和 CVE-2017-5689 就比较可怕了,可以被远程利用。

需要特别注意的是,一般的家用 PC 和笔记本默认是不会受到上述远程漏洞利用的影响,因为消费级产品并没有对 vPro 的支持,但是可以被通过与其他漏洞组合(例如利用本地漏洞强制开启 AMT 功能,即便你的 Intel ME 固件为阉割版)从而被利用。

关于强制开启 AMT 功能,可以参考这篇文档

说了这么多,该说说这个缺陷怎么预防了。

首先:虚拟机内的环境不受这个漏洞的影响,并不会造成虚拟机逃逸。

其次:这个漏洞唯一的修复方法就是刷 BIOS(准确地说:刷 Intel ME 的固件)。对于用户来说刷 BIOS 是有一定风险的,操作不当很容易导致机器变砖。可以参考各大主板厂商的网站进行 BIOS 升级操作。如果你是有经验的用户,可以尝试对 Intel ME 固件进行清除(具体可参考萌狼的 X230 + Coreboot + me_cleaner + …… = ? 一文)。如果你的硬件太旧了,甚至厂商已经放弃支持了,那么就应该考虑换硬件了。

 

然后来说说 Meltdown 和 Spectre 漏洞。

Meltdown 漏洞,目前被证实存在于 1995 年之后生产的所有 Intel CPU 中(除了 2013 年之前生产的 Intel Itanium 和 Intel Atom 系列),但不排除可能在 AMD 或 ARM 平台上被利用的可能性。顾名思义这个单词是“熔断”之含义,不过它熔断了什么呢?

对操作系统有了解的人应该知道,在操作系统中,用户程序与内核之间的内存是隔离的,正常情况下一个用户运行的程序并不允许读取内核所使用的内存地址,以防止未经授权的读取。而这个漏洞则熔断了本应存在的保护。

由于这是一个硬件的漏洞,所以就算使用虚拟机也不能保护不受这个漏洞的影响(因为无论再怎么虚拟,指令还是要交给 CPU 进行处理),所以云服务商可基本就惨啦,各个虚拟机之间可以读别人的内存,甚至母机的内存。而普通用户也会受到这个漏洞的影响,假设你的浏览器开启了 JavaScript,那么特定的脚本就可以利用这个漏洞。这个漏洞只能对内存进行读取,不能修改,不过仍然可以读取在内存的敏感信息,如加密的私钥和密码等。

不过好在,通过内核补丁可以防止对这个漏洞的利用,不过会有一定幅度的减少系统性能,因为在使用内存时内核需要进行额外的运算(处理对应的内存 mapping table)。

防范方法是:打补丁!打补丁!打补丁!Linux 和 Windows 等系统已经出了补丁,还等什么?赶紧打补丁!

 

而第二个 Spectre 漏洞就比较复杂了,而且没有太好的软件解决方案。最好的解决方案就是重新设计硬件,当然这会是一笔很大的开销。这个漏洞影响了几乎所有品牌的处理器,包括 Intel、AMD、ARM,以及几乎所有的桌面、笔记本、服务器甚至手机。

根据论文,现代的 CPU 采用了分支预测branch prediction)以及预测执行speculative execution)以提升效率。这个攻击的实现条件是引诱受害者执行一个正常程序执行时不会出现的操作(例如读取一个指定的内存地址),然后让 CPU 放弃其缓存的用来预测的必要的值,之后通过侧信道攻击(如 flush+reload 或 evict+reload)获取受害者的内存数据。这个漏洞出现的最根本的原因是因为 CPU 在预测执行的过程中忽视了安全并导致大部分的软件层面上的安全机制失效。

由于这个漏洞产生的原因极为底层,所以很不幸,截至本文发出前并没有一个可靠的解决方案。但是有一点你值得庆幸,那就是漏洞利用方法十分复杂,所以目前还不需要担心被大规模利用。或许你唯一可以做的就是等待上游开发者发布补丁,并及时安装 。

]]>
https://blog.yandere.moe/moe/cpuisnotsecure/176.html/feed 4