通过电话联系人,当他们的手机可能有恶意软件时

信息安全 移动的 正直 社会工程学 手机 可用性
2021-09-01 10:37:47

我有一个问题设置,我想通过电话联系用户,并且我需要尽可能保护电话的完整性。我想知道如何以最好的方式设计交互。

我担心一个非常具体的安全风险:我正在联系的人可能正在使用智能手机,并且可能在没有意识到的情况下在他们的手机上安装了恶意的第三方应用程序;而且我担心这个恶意应用程序可能会试图篡改通话的音频。我担心恶意应用程序可能会以某种方式在通话中注入虚假音频。我不需要保护对话的机密性——电话不会包含任何秘密——但我非常关心电话的完整性。

我的问题:如何尽可能减少这种风险?


对问题进行更多阐述。 我有相当多的自由度可供我使用:

  • 我可以安排向任一方向拨打电话(我可以给用户打电话;或者我可以安排用户给我打电话)。

  • 我控制电话的内容,因此我可以结合各种“类似验证码”的机制来尝试测试我是在与人交谈而不是与恶意软件交谈,或者我可以让用户重复对他说的话并且反之亦然,作为一种确认形式,如果有帮助的话。

  • 如果一个方向的音频通道可以比另一个方向更有效地保护,我可以围绕它设计与用户的交互。例如,如果可以在从用户到我的方向(用户对我说的内容)保护音频通道的完整性,但不能在相反的方向上保护,我可以接受。我也可以接受另一种方式——只要我知道可以保护哪个方向。

我的主要关注点是防御无法突破其应用程序沙箱的恶意应用程序(例如,它无法获得 root 权限)。假设用户的手机没有root,没有越狱等。此外,我们假设恶意应用程序是受应用程序沙箱限制的第三方应用程序,例如,它仅限于使用第三方可用的任何API-派对应用。(如果还可以使用一些特权升级漏洞来防御突破沙箱的应用程序,那将是一个不错的奖励,但我猜没有很好的防御措施来抵御这种威胁,因此我专注于留在范围内的应用程序沙箱。)对于我的应用程序,检测篡改就足够了(当然,如果可以完全防止它,那就更好了)。

那么,应对这种威胁的最佳防御措施是什么?

约束。用户是普通大众。他们将拥有他们拥有的任何电话;我不能强迫他们使用不同的电话或给他们不同的电话。我怀疑需要一些特殊的应用程序来加密他们的电话是不切实际的(而且我不确定这是否会有所帮助,无论如何......)。我将需要能够联系许多这样的用户,因此任何解决方案都必须扩展。我希望解决方案对用户尽可能有用。


我做过的研究。我已经查看了恶意应用程序可能在 Android 和 iOS 上使用文档化 API 执行的操作。

在 iOS 上,我无法找到任何方法让恶意第三方应用程序篡改电话内容。我意识到这不能保证这是不可能的;我只是还没有找到办法。

在 Android 上,在这种威胁模型中,似乎无法保护用户拨打的呼出电话的完整性。恶意应用程序可以观察用户何时拨出电话、取消通话、控制麦克风和扬声器、显示虚假拨号屏幕,并让用户在实际与恶意软件通话时认为他们在与我通话. 恶意应用程序将至少需要PROCESS_OUTGOING_CALLSRECORD_AUDIO权限(并且可能MODIFY_AUDIO_SETTINGS),但如果用户安装的应用程序之一是恶意的,这可能会发生。

然而,相比之下,在 Android 上,向用户发出的呼叫看起来可能是安全的——或者,至少,如果与用户的对话结构适当,则可能会变得安全。应用程序可以检测到有来电。在旧版本的 Android 上,应用程序可以阻止来电并防止手机响铃或显示任何来电迹象。然而,最新版本的 Android 已经删除了后一个功能:似乎没有程序化的方式让应用程序在用户没有意识到的情况下阻止来电。此外,如果用户接听来电,那么第三方应用程序似乎无法访问或修改通话内容。不过,情况有点棘手。我认为它应用程序 可以在从我到用户的方向静音音频通道并播放音频剪辑(这可能需要MODIFY_AUDIO_SETTINGS许可,但我们假设恶意应用程序也有),从而在那个方向伪造音频:欺骗用户认为音频剪辑来自我,而实际上它来自恶意应用程序。但是,我还没有找到恶意应用程序窃听调用内容的任何方法,所以如果我们在调用中引入足够的随机性,我们可能会使恶意应用程序难以准确猜测何时进行此攻击,如果恶意应用猜错了,那么很明显有些地方出了问题。因此,至少在我看来,我们可以设计一些交互脚本,让恶意应用程序很难欺骗我,这似乎是合理的。

如果用户使用的是功能手机,他们就无法安装第三方应用程序,因此这种担忧就消失了。

候选稻草人解决方案。这项研究使我找到了一个候选协议/脚本,用于将信息 X 传达给用户:

  • 我打电话给用户。(别给我打电话,我给你打电话。)

  • 我与用户闲聊了一段时间,时间是随机的。

  • 我将信息 X 告诉用户。

  • 我要求用户通过向我重复此信息 X 来确认。用户很乐意对我说 X。

  • 我感谢用户,说再见,然后挂断电话。

  • 在整个通话过程中,我在后台轻柔地播放了一些随机选择的音乐(即,在整个通话过程中都在播放同一首歌曲,并且用户可以在整个通话过程中在后台听到它)。

通话开始时随机持续时间闲聊的目的是随机化信息 X 的通信时间,以便恶意应用程序无法通过静音从我到用户的音频通道并播放来“覆盖”它一个音频剪辑(恶意应用程序不知道在什么时间执行此操作,因为我已经随机化了 X 的通信时间)。让用户向我确认的目的是作为额外的后备防御,以防恶意应用程序试图通过使我静音和播放音频剪辑来欺骗我。音乐的目的是让用户有机会注意到我的部分音频是否在任何时间点被替换。

这只是我想到的一个候选协议。我提到它只是作为一个起点和一个稻草人供你批评。希望您能找到更好的解决方案。也许您会发现此协议存在严重问题。没关系。我正在寻找我能想出的最佳方案,而且我不致力于任何特定的协议或交互方式——你告诉我我应该使用什么协议。

应用程序设置。如果您关心,应用程序设置是远程投票,我想使用电话通道来确认用户的投票,并防止恶意软件在没有检测到的情况下更改用户的投票。然而,一个好的解决方案在其他设置中也可能有用,例如,在线银行交易的电话确认或使用电话确认作为交易中的一个步骤的其他高安全设置。

有关的。另请参阅恶意电话软件能否对电话发起 MITM 攻击?. 然而,这个问题集中在恶意代码的威胁模型上,它突破了应用程序沙箱并获得了手机的根级访问权限;在那个威胁模型中,事情看起来毫无希望。 这个问题侧重于稍微不同的威胁模型,其中用户确实安装了恶意应用程序,但恶意软件无法突破应用程序沙箱。

4个回答

如果客户端被入侵,它就不能被信任,句号,句号。您无法控制且无法信任的任何设备都可能以任何方式出现异常行为。如果您想信任不受信任的设备的部分安全性,则需要一个受信任的第三方来验证它的行为。

不幸的是,计算机对于最终用户来说太复杂了,无法在这里提供太多帮助。使用任何通用计算设备,一切皆有可能,具体取决于攻击者的复杂性。可以更换设备,可以利用低级别的零日黑客攻击,可以执行和隐藏中间人攻击等。最终用户根本无法用不受信任的设备验证不受信任的设备。尝试使用某种机制来解决这个问题有点像要求攻击者漂亮地重复你刚才说的话然后忘记它。

如果您在电话之外有受信任的电子设备,则可以使用不受信任的电话获取电话的可散列副本,该副本可以与呼叫者提供的安全签名散列进行比较。这将验证不受信任的电话是否通过受信任的设备准确地将信息传递给/来自呼叫者,至少只要您收听音频文件并确保它没有被更改。

但是,如果没有受信任的计算机,就没有一种好方法可以完成如此​​复杂的事情,因此,如果这不是一种选择,您必须通过不受信任的设备进行通信。由于您没有用于此目的的计算机,因此您必须使用正在通话的人作为安全客户端。这意味着您仅限于用户可以在脑海中执行的加密系统(密码、一次性密码等)。您只与您使用的加密系统一样安全(通常比数字安全得多,尽管 OTP 更安全)。由于攻击者不知道在说什么,他们将不知道如何进行有意义的更改,并且通信双方对秘密的了解验证了真实性。

我将根据这里的答案和评论以及我所做的其他研究进行总结。

如果恶意应用可以突破沙箱

如果应用程序可以突破沙盒,它看起来毫无希望。该应用程序可以控制麦克风和扬声器,因此没有可信路径,攻击很容易。

再一次,这个问题特别指出,这是针对应用程序无法突破沙箱的情况。所以,让我们从这里开始关注它。

安卓

在 Android 上,情况看起来很糟糕,即使恶意应用程序无法突破沙箱。有两个严重的问题。

首先,恶意 Android 应用程序可以拦截用户发出的呼出电话,并对他们进行任意 MITM 攻击。如问题所述,恶意应用程序可以观察用户何时拨出电话,取消通话,控制麦克风和扬声器,显示虚假拨号屏幕,并让用户认为他们在与我通话时实际上是在与恶意软件对话。恶意应用程序将至少需要PROCESS_OUTGOING_CALLSRECORD_AUDIO权限(并且可能MODIFY_AUDIO_SETTINGS),但如果用户安装的应用程序之一是恶意的,这可能会发生。所以拨出电话是正确的。

其次,恶意 Android 应用程序可以拦截用户收到的来电并对其进行任意 MITM 攻击。正如 AJ Henderson 解释的那样,恶意应用程序可以临时设置呼叫转移,以便将来电重定向到另一个号码。恶意应用程序需要做的所有事情,设置呼叫转移,就是拨打类似的电话*21*6661234567#这会将后续呼叫转发到 666-123-4567(由攻击者控制的东西)。现在,攻击者可以接听这些电话并对所有电话发起 MITM 攻击,没有任何限制。甚至有一些方法可以让用户隐藏这种攻击,例如,通过使用条件转发。我找不到任何方法让拨打电话的人检测到电话已以这种方式被拦截。恶意应用程序确实需要CALL_PHONE 许可,但恶意应用程序可能有此权限。

因此,在 Android 上,我们被淹没了。如果电话是用户拨打的,就可以被拦截。如果电话是打给用户的,呼叫转移攻击可以拦截它。如果他们的手机上有恶意应用程序,似乎无法通过语音安全地联系 Android 用户。令人惊讶,但真实!

iPhone

对于 iPhone,情况似乎有所不同。据我所知,在 iPhone 上,恶意应用程序无法在不突破沙盒的情况下干扰电话呼叫。因此,如果恶意应用程序无法突破沙盒,它就无法与语音通话混为一谈,无论它们放置在哪个方向(呼出或呼入)。

简而言之:iPhone 似乎更安全。与 iPhone 用户建立语音通话非常简单,即使是手机上的恶意应用程序也无法篡改(再次假设恶意应用程序无法突破其沙箱)。

底线

底线是,如果我们需要给某人打电话,那就是我们被搞砸了。如果我们不知道他们使用的是哪种手机(实际上我们可能不会,对于消费者应用程序),我们将不知道他们是否使用了像 Android 这样的易受攻击的平台,在该平台上无法建立在手机上存在不良应用程序的情况下进行安全语音通话,或者他们是否使用更安全的平台(如 iOS 或功能手机)。我们不能说。而且,对于消费者应用程序,让普通人在街上使用加密语音可能是不可行的,只是为了我们的一次性电话。

所以,情况看起来不太好。


为什么不将语音通话视为不受信任的渠道?

一些受访者问我们为什么不将语音通话视为不受信任的渠道。答案很简单:这会导致没有吸引力的解决方案。如果我们将语音通道视为完全不受信任,那么我们唯一剩下的选择就是端到端加密,今天大多数普通人在他们的手机上都没有。因此,如果我们将语音通话视为完全不受信任的渠道,那么我们真的搞砸了:答案变成,对不起,你不能这样做,因为你希望能够在街上打电话给任意的人。如果我们将语音通话视为完全不受信任,那么我们将被迫放弃。我不想放弃,除非万不得已。

一两个受访者声称语音通道完全不受信任。但是,他们没有提供任何证据来支持这一说法。至少在 iOS 和问题中阐述的威胁模型(恶意应用程序,但无法突破沙箱)的情况下,这种断言似乎完全是错误的:语音通道并非完全不受信任。

完全不受信任的通道和部分不受信任的通道之间存在重要区别。例如,考虑一个攻击者可以被动窃听但攻击者无法修改消息的通道。这样的通道提供完整性但不提供机密性,这对于某些目的来说已经足够了。我们可以将这样的通道称为部分不受信任。但是,将其视为完全不受信任会过于谨慎,因为这样的渠道显然足以满足某些目的。

本质上,您需要将其视为不受信任通道上的任何其他协议。即您需要交换消息,验证是否收到了所有消息,并证明它们未更改。在这种情况下,消息是说出来的,但这对解决方案的形式无关紧要,因为您已经指出语音通信的独特属性(语音识别、识别对话是否正确等)不能被信任你的场景。

由于您不能依靠该人的声音来验证消息(您已经表明这可以被合成或重放),您将不得不让他们使用带有某种消息验证系统的纸笔密码。如果他们有一个可以信任的外部设备,您也可以使用外部设备进行加密。

一次性垫可能最容易使用,并且会提供加密、身份验证(通过拥有垫)和抗重放(因为垫只使用一次)。每条消息都可以加密,并通过电话读出,每条回复也可以。

当然,如果您无法分配垫子,这将是不好的。

如果恶意软件不是偏执强大,您可以在对话期间播放一些背景音乐。最后,您要求对方告诉您正在播放什么音乐,并询问他们是否注意到音乐中有任何停顿(这表明对话已被破坏)。如果说话者重复信息是安全的,重复也有效。最后,如果你能证实你和你的听众都可以流利地说一种不同于你“想要”的语言。这甚至会欺骗高级恶意软件,但在实践中很难实现。

如果您选择背景音乐选项,请确保它非常熟悉(例如听众的国歌)并且几乎没有停顿。