*本文作者:新希望鲜牛奶,本文属FreeBuf原创奖励计划,未经许可禁止转载。
本文通过对Android源码中NFC部分的简单分析,实现了另外一种设置UID的方式,可用于部分场景下的门禁卡模拟。
一、背景
本人就读于西南地区某大学,学校于2016年为学生宿舍楼大门安装了NFC门禁系统。这个时候手机的NFC技术已经相当成熟,网上充斥着各种手机模拟门禁、刷公交的帖子,各大手机厂商也与公交公司合作共同推进手机刷公交的进步。于是我也试着看看能不能用手机来刷开宿舍的门禁。我通过Acr122u将校园卡的UID写入一张MIFARE® Classic 1K兼容卡片后,成功刷开了宿舍的大门。
从08年NXP公司的MIFARE® Classic Cards被攻破后,M1卡就不再具有安全性,在如身份识别、电子钱包等需要一定安全性的场景下逐渐被安全性更高CPU卡取代。但是由于CPU卡本生比M1卡成本高,并且某些工程中大量使用的M1卡及相关系统全面更新将会是一大笔支出,加之新系统建设时监管不严,目前仍有部分工程中使用着M1卡。可笑的是16年安装的门禁居然是通过UID来进行身份验证(即使我们校园卡是复旦CPU卡)。安全建设的实施情况可见一斑。既然已经确定了它通过UID进行身份识别,那接下来的工作便是在手机上来模拟这样一张具有固定UID的卡片了。
二、原理分析
NFC设备有三种工作模式:Tag Reader/Writer、Peer to Peer、Card Emulation模式,详情可参见NFC Forum的介绍。现在很多安卓手机都具有NFC芯片,安卓系统也从Android 4.4开始原生提供了NFC卡片模拟的实现,即HCE。但是Android系统提供的卡模拟API是工作在国际智能卡标准ISO 7816-4下,同时Android也明确指出了使用ISO/IEC 14443-3协议中用于冲突检测的UID进行身份识别是不安全的,所以Android也没有提供控制UID的相关API,详情可参见这里。因此我们使用Android手机来进行卡模拟时,通过读卡器读到的UID通常是以0x08开头的随即值,这是ISO/IEC 14443-3标准的Anticollision部分要求的。当然这一点,不同的厂家有不同的实现,并且目前流行于Android平台的Broadcom和NXP这两