信息的定义:
消息是“对不确定性的消除”。有时候没有消息是最糟糕的消息,没有消息代表所有的可能性都有,反面来说就是所有的都是不确定的,没有任何消息时,不确定性是最大的。那么消息带来的就是对不确定性消除的能力,消除的不确定性越多代表信息的量越大。
机密性定义:
机密性是“对不确定性的保持或者增加”。如果一个消息导致了不确定性的消除,那么这个消息就危害到了机密性,当不确定性消除到了不能容忍的地步,就出现了机密性漏洞。
下面我们举例实际工作中的机密性设计问题。
首先我们可以回顾一下身份ID设计的关键要素的内容——安全架构——身份ID设计的要素。中列举的例子。
举一个由于有规律设计ID导致信息泄露的例子:
某电商网站,订单号的ID是全局递增的,也就是说第一个订单号是1,第二个订单号是2,以此类推。这种ID的设计方案是能很好的保证ID的唯一性属性,但是这个ID泄露了电商的订单数目,攻击者创建一个订单,这个订单号就是整个电商之前的所有订单数目+1的值;攻击者每天凌晨创建一个订单并且记录订单号X,午夜再创建一个订单并且记录订单号Y,那么Y-X的值就是电商一天的订单数。
API相关的机密性设计
所有的接口都是设计用于对外部刺激做出响应的。按照信息的定义,任何响应都会导致不确定性的降低。那么对于攻击者而言接口能降低哪些不确定性呢?这是一个逻辑倒置的问题,首先需要知道攻击者的想解决咋样的问题(当然一般我们说他想做出咋样的攻击),对于解决这个问题有哪些不确定性的问题需要解决。这个问题对于防守的我们来说是不得而知的,但是我们可以做一个通盘的考虑和防护。
只要接口对外提供服务,那就会暴露一个特别重要的属性——时间(响应时间,处理时间等时间相关的属性),由于时间本来就是一个物理属性,在不做物理隔离的情况下,时间属性是天然暴漏的。时间参数背后能被推理攻击的是系统的计算能力,系统的部署情况等信息。对于这些信息,商业系统一般是不在乎的,当然对于伊朗核设施那种级别的系统就需要考虑,这类问题和基于时间属性的隐蔽通道的问题。
接口的返回数据以数据来源分类可以分为两大类:
1.接口逻辑实现代码的返回值;此类返回值是业务的需要内容,在设计的时候需要做机密性考虑,如“各种ID设计”中的分析。
2.运行接口逻辑实现代码的容器的返回值;这类返回值一般都是错误信息(如,debug信息)和容器的指纹信息,生产系统一定要杜绝此类信息的输出,通过容器配置配合应用级代理防火墙对此类信息屏蔽。
接口错误码——机密性设计的重灾区
接口的错误码是为了方便定位接口调用失败原因而设计的,所以设计之初,开发尽可能细粒度的报告内部的处理结果。常见的风险案例就是登陆接口,登陆失败返回时用户名不存在还是密码错误,这样导致攻击者可以利用用户名不存在的错误提醒获得整个网站的登陆用户名。
机密性保护的范式表达
1,真正表达的意思是通过编码的方式表达出来的;
2,真正要表达m个意思映射到编码空间上n;
3,对攻击者而言,没有收到任何信息之前的不确定性是m,收到一条消息x,消息不确定性降低了m(x/n);
4,提高机密性的方法:
•m和n的映射关系是随时间不断变化的;
•n远小于m,这样就实现了信息的有损压缩,导致了信息的丢失,如通过hmac来实现对完整性的校验
•m和n的映射关系私有,加密就是一种私有映射的实现。
来源:freebuf.com 2020-12-30 23:51:50 by: 钱塘山人2020
请登录后发表评论
注册