防止终端回滚保存到磁盘?

防止终端回滚保存到磁盘?

我的问题与Mac 终端的回滚位置在哪里?

我想生成一个 Google 身份验证器代码。这将在命令行上显示一个二维码,我可以用手机扫描该二维码来添加 TOTP 生成种子。

我可以在登录到将使用 TOTP 代码的服务器时执行此操作。(这适用于使用第二个身份验证因素的 SSH 登录。)

但是,我想确保二维码不会保存在我的笔记本电脑的任何地方,因为它包含 TOTP 生成的秘密种子。

因此,我想使用不同的终端设置,曾经将终端回滚历史记录保存到磁盘,或禁用此功能完全地(暂时)这样我就可以生成二维码,将其显示在我的屏幕上,用我的手机扫描它,然后关闭我电脑上的窗口,并确保二维码根本没有存储在我的电脑上的任何地方,即使使用文件恢复软件也不会存储。

我怎样才能做到这一点?

答案1

首先,你必须确保你没有交换,或者交换是加密的。进程内存的片段可以随时被交换出去,然后放在磁盘上。

其次,您需要知道,几乎不可能从 RAM 中清除所有已处理数据的残留,这些数据经过了多步复制,可能位于malloc()终端或ssh客户端的已处理区域,也可能未经清除就释放回操作系统。或者位于显示服务器 (X11/Wayland) 的内存、视频卡的内存等中。如果攻击者以某种方式访问​​了您的 RAM(您正在运行的计算机),那么保护您的数据就毫无希望了。

因此,通过确保您的终端不会将回滚写入磁盘,您只能在计算机关闭并被盗时才能获得保护。而且只有当您的交换区已加密时,才能获得保护。此外,我假设您的主磁盘未加密,因为这样就不会成为问题。

我不知道其他终端会做什么,但我知道 VTE(GNOME Terminal、GNOME Con​​sole、Tilix、Terminator、Xfce4-Terminal、Guake、RoxTerm 和许多其他终端使用)会做什么。它将回滚写入磁盘(当它在屏幕上时还不会写入,只有在它滚出后才会写入 [参见下面的更正]),但会加密该数据,并在该终端选项卡或窗口关闭后立即从内存中明确擦除加密密钥(如果它因某种原因崩溃(这种情况很少发生)或被终止,它可能会保留在内存中)。

我还要说一下,我认为没有任何终端会将屏幕上的内容写入磁盘 [见下面的更正]。这些位可以极快地变化,将它们写入磁盘会对性能和磁盘寿命产生不利影响,并且没有任何用处(我的意思是:它会从内存中清除,并在需要时从磁盘读回吗?非常昂贵。或者它也会保存在内存中?那为什么要把它写出来?)即使终端写出它的回滚,它也几乎肯定只对滚动出终端正常视口的数据执行此操作。如果您使用二维码关闭终端(正如您所说的那样,您计划这样做),而不是将其重新用于新命令,让二维码向上滚动到回滚缓冲区,那么几乎肯定没有终端会将其写入磁盘(除非您在终端中设置了某种日志记录或调试)。

相当多的终端仿真器支持一次性选项(例如,在命令行中指定不使用回滚缓冲区)或多个配置文件(定义一个没有回滚缓冲区的配置文件,使用该配置文件为二维码启动一个新终端)。这提供了额外的保护:如果您不小心通过执行产生长输出的命令来跟踪二维码,您的二维码仍然不会出现在回滚缓冲区中。

您还可以将打印二维码的工具封装在包装器脚本中,以减少错误地将其滚动到回滚缓冲区的机会。例如,包装器代码可以等待您按下 Enter,然后将光标移到首页并用空格或类似内容覆盖屏幕。但请注意:clear在某些终端中,此操作是通过就地擦除屏幕上的内容来实现的,而在其他一些终端(例如 VTE)中,则通过将它们滚动到回滚缓冲区来实现!您可以做的另一件事是切换到备用屏幕(tput smcup;返回正常屏幕:tput rmcup)。备用屏幕没有回滚缓冲区,无论您在那里滚动什么,都应该永远丢失(但请仔细检查终端的行为)。请注意,离开备用屏幕并不会清除它,如果您切换回它,它的内容会恢复,因此您应该在切换之前清除它。您可以进一步将其与终端仿真器配置文件相结合,该配置文件将此脚本作为其自定义命令启动,或者与使用特定设置启动终端仿真器的命令相结合,以仅运行此脚本。这样,您就可以过度保护二维码不会滚动出去,但即使滚动出去,也没有配置回滚缓冲区。

但遗憾的是,这些都无法保护你免受二维码的侵害,因为二维码可能以多种格式长期存在于 RAM 的许多地方。我想不出有什么保护措施可以防止这种情况。


更正:

当您水平调整窗口大小时,VTE 会将“常规区域”的内容写入磁盘。通常,它会在写入之前加密数据。

你可能会问,为什么它会这样做。在调整大小时,它会重新包装(重新排列)行,这是一个极其复杂的代码。“常规区域”是一种格式(在内存中),而回滚是另一种格式(在磁盘上)。重新包装两者需要为两种截然不同的数据结构实现相同的基本重新包装逻辑,确保它在这两种数据结构上的操作相同,并且在两者拼接在一起的地方没有问题。相反,已经存在的从一种格式转换为另一种格式的代码用于将“常规区域”转换为回滚的格式(因此也存储在磁盘上),然后在该单个数据结构上执行重新包装,最后将最后一屏转换回内存格式。

此代码仅当终端的宽度发生变化时才会启动(如果仅高度发生变化,则无需重新换行),并且仅适用于正常屏幕(备用屏幕的内容不会重新换行)。

相关内容