如何糟糕的随机数发生器冻结摇摆(2020)

2021-03-16 06:18:32

几个月前,我决定从i3窗口管理器切换,该管理器使用x显示协议来摇摆,它使用新的WAILAND协议。这一决定是基于I3在I3的显示特定工作区的事实,因为我想尝试新的东西。起初它进展顺利,真的很好 - 事实上 - 工作区完美地工作,我过去常常的撕裂是不存在的。

在我更新摇摆并重新启动后,一切都很顺利。摇摆在启动时立即冻结并保持键盘输入。经过一些调查,我发现Waybar似乎是问题。从Config中删除它让摇摆启动并正常工作......或者我想。随机,摇摆将完全冻结,与启动时的方式相同,所以是时候调试了。

通过运行Sway,播放调试日志的播放调试日志非常微不足道:Sway -d 2> 〜/ sway.log它没有产生了很多1.理想的解决方案是找出摇摆与核心转储悬挂的地方,但这难以理解,因为摇摆现在冻结并用它,键盘输入。因此,借助Sysrq快捷方式是必要的。这些快捷方式在内核中实现,以便在冻结等案例中执行基本,但重要的操作。以下是其中一些最常见的2:

- 除了Xyene的慷慨帮助之外,所有人都得到了帮助。谢谢,如果你读过这个。

因此,要获得蠕动进程的核心转储,我首先使用横切快捷方式,然后切换到tty并运行以下命令:

json_c_get_random_seed()in / usr / lib / libjson - c中的0 0x00007fcbb12c6f。所以.5 1 0x00007fcbb1011fd6 in()在/ usr / lib / libjson - c。所以.5 2 0x00007fcbb100c713在json_object_object_add_ex()at / usr / lib / libjson - c。所以.5 3 0x0000561DC53E42FF在IPC_JSON_DESCRIBE_BAR_CONFIG中(栏=栏@条目= 0x561dc6f0cmbb0)。 C:1013 __pretty_function__ =" ipc_json_describe_bar_config" JSON = 0x561DC74DA8B0间隙=<优化>颜色=<优化> Tray_Bindings =<优化>托架_bind =<优化> #截断......

这揭示的是,由于JSON-C,摇摆的摇摆正在冻结,这是一个摇摆使用的JSON解析库。查看JSON-C的源代码,可以看到在无限循环中调用JSON_C_GET_RANDOM_SEED函数,同时检查结果是否为-1。所以,我们发现了JSON-C冻结的地方,但为什么仍然存在。

DELVINGINATOJSON_C_GET_RANDOM_SEED,另一个名为get_rdrand_seed的函数是运行,以尝试使用RDRAND CPU指令获取随机数。除了考虑到我的CPU是AMD Ryzen 5 3600x的事实外,这似乎很好。其中有时有一个可怕的故障的RDRAND指令,始终返回0xFFFFFFFFFFFFFFFFFFFFFF(这是-1)。这不是一个问题,因为很少有进程尝试使用Rdrand而不检查它是否失败,通常依赖/开/ urandom。 Linux内核和SystemD都检查以确保RDRAND返回SANE随机数。

因此,最终修复了这个辉煌的错误,Xyene介绍了一个禁用RDRAND的rdrand指令,检查了是否在行中返回相同的值10次。以下重要部分如下:

//一些CPU在CPUID中宣传RDRAND,但无条件地返回0xFFFFFFFF //。避免以后锁定,在此测试RDRAND。如果超过// 10试验Rdrand返回相同的值,请宣布破碎。 _has_rdrand = 0; int prev = get_rdrand_seed(); for(int i = 0; i< 10; i ++){int temp = get_rdrand_seed(); if(temp!= prev){_has_rdrand = 1;休息 ; } prev = temp; }

这个叶禁用正常RDRAND指令高达0.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004%(4.68e-95%)的机会。

由于某些内联组件,还需要进行后续修补程序,试图获取此处可以看到的CPUID位。

对于JSON-C / JSON-C#489和JSON-C / JSON-C#489和JSON-C / JSON-C#590,此博客的相关摇摆问题是Swaywm / Sway#5290以及用于JSON-C问题的JSON-C / JSON-C#590。

这些是安全重启所需的快捷方式,从Arch Wiki中取出。 ↩

这也需要一个摇摆的构建,它没有' t条符号。 这是通过使用摇摆git包关闭AUR来完成的。 核心转储在此处提供。 ↩