作者:Longas_杨叔


基于180张真实登机牌样本分析的成果


Security Research of BCBP
——————————–
0x01    登机牌票面结构
0x02    涉及主要技术
0x03    国内外登机牌解析实例
0x04    攻击与隐私泄露风险
0x05    国内安全现状
0x06    安全强化措施
0x07    小结
附录
——————————-

(注:本文写于2015年10月,由于涉及一项专利当时没有对外发布,没想到一拖就是大半年…..)

所谓BCBP,全称为Bar Coded Boarding Pass,即条形码登机牌。BCBP是目前由IATA国际航协在全球所有航空所使用的标准,BCBP定义了可打印在纸质登机牌或发送到移动设备的电子登机牌的二维/一维条形码。近期一些新闻媒体爆出登机牌可能泄露个人信息的报道,但细节如何却不得而知,于是乎我翻出了过去数年出差留下的180张真实登机牌依次过了一遍……也是拼了。

0x01    登机牌票面结构


1.1    登机牌票面主要组成


   目前国内航空公司在使用的登机牌,其票面结构基本如下图所示:


   为方便理解,下表为上图中不同区域数值的解释:


1.2    关于API和PNR


   出入境管理/边检部门从航空公司获取的乘客信息主要包含两大类: API(旅客预报信息)和PNR(旅客订座信息)。
   根据美国、加拿大、英国等国家有关政府部门的要求,所有前往或途经这些国家的乘客(来回程航班旅客,包括婴儿),须向其订票代理提供API信息。API信息是一种旅客预报信息,内容包括护照、签证以及前往城市的住址等信息。乘客在出票前务必提供完整信息,以确保顺利办理出入境手续。
   同样的,按照要求,只要国际航班一起飞,所有旅客的数据将形成电子舱单,透过专用网络实时传输到中国边检,预报班机载运旅客和机组人员的姓名、国籍、性别、出生日期、护照证件有效期以及截止期等信息。边检部门将在班机抵达前两小时收到班机上所有人员的详细数据,并提前处理。
   旅客姓名记录(PNR)是指航空器运营人或其代理为每名预期旅客的每项订座所建记录而起的通用名称。各国已开始要求航空公司提供旅客姓名记录数据,因为该资料被认为对分析该数据可得出的威胁评估值,尤其是对国际反恐怖主义的斗争十分重要。

0x02    涉及主要技术

2.2  一维条码


   一维条码分类很多,不过在中国的大部分机场的值机柜台上为旅客打印的登机牌,所包含的条码一般都为128码。

   Code128即128码是一种长度可变、连续性的一维条码。由于可表示从ASCII0到ASCII127共128个字符,故称128码。128码采用四中单元宽度,每个条码字符由三个条和是那个空共是一个模块组成。与另一种一维条码“39码”相比,128码单位长度里包含的数据更多,在包含相同数据、相同长度的条码中,条码更稀疏。对于机场来说,即使打印清晰度差一些,也能被扫描设备正常识别。


2.3  二维条码


   在水平和垂直方向的二维空间存储信息的条码,称为二维条码(2-dimensional bar code)。与一维条码一样,二维条码也有许多不同的编码方法,或称码制。就编码原理而言,通常可分为以下三类:
1)线性堆叠式二维码是在一维条码编码原理的基础上,将多个一维码在纵向堆叠而产生的。典型的码制如:Code16K、Code49、PDF417等。
2)矩阵式二维码是在一个矩形空间通过黑、白像素在矩阵中的不同分布进行编码。典型的码制如:Aztec、MaxiCode、QRCode、DataMatrix等。
3)邮政码通过不同长度的条进行编码,主要用于邮件编码,如:Postnet、BPO4-State。

   其中,ATA国际航协在2005年确立了标准二维条形码PDF417,被广泛应用于机场登机牌上,其不但包含更多数据,也支持更多安全和加密功能。PDF417由美国Symbol(讯宝)公司研制,也是中国现行唯一通过国家标准认证的二维条码。

   2008年航空业订立了无纸化的手机条码登机牌标准。打印出的数据和手机登机牌的数据是相同的,但手机登机牌的代码看起来略有不同。可以使用的手机二维条码为Aztec、Datamatrix或QRcodes。而在2010年12月23日,在航空公司、机场、服务提供商和国际航协的共同努力下,100%完成了二维条码登机牌的更换。2000多家航空公司已经启动简化业务(StB)计划。简化业务能够提高效率及旅客的舒适度,加强航空公司和机场之间的沟通、优先处理和协调申请,以便有效地按照全球标准计划部署执行。

0x03    国内外登机牌解析实例


   国际航协2005年定义了纸质登机牌的二维条码标准。在2008年二维条码标准扩充包含移动手机的二维条码,单航段条码内容包括:始发地、目的地、航班号、航班日期、舱位、座位号、登机序号等197位信息。下面我们就对一些实例展开分析,注:下列登机牌有些来自互联网公开搜索结果。


3.1  实例1:美国航空登机牌


   在互联网上看到国外有人在Twitter上晒登机牌,虽然涂抹了姓名,如下图所示:

读取上图中登机牌的编码(红色框),获得如下数据:
—————————————————————-
0000  4d 31 57 41 4b 45 46 49  45 4c 44 2f 44 41 52 52      | M1WAKEFIELD/DARR    |
0010  45 4e 20 4d 52 20 45 4f  4f 50 43 50 57 20 4f 52        | EN MR EOOPCPW OR   |
0020  44 4c 41 53 41 41 20 32  35 33 37 20 32 39 39 41     | DLASAA 2537 299A       |
0030  30 30 33 42 30 30 37 30  20 31 33 42 3e 31 30 42     | 003B0070 13B>10B       |
0040  20 20 20 30 32 39 39 42  41 41 20 32 39 30 30 31     |    0299BAA 29001          |
0050  31 36 30 35 32 34 31 36  30 36 30 20 41 41 20 51     | 16052416060 AA Q       |
0060  46 20 51 46 2a 2a 38 35  36 30 20 20 20 20 20 20     | F QF**8560                   |
0070  20 20 20 20 20 20 38                                                   |       8                              |

—————————————————————-
对应串码如下:
M1WAKEFIELD/DARREN MR EOOPCPW ORDLASAA 2537 299A003B0070 13B>10B 0299BAA 2900116052416060 AA QF QF**8560 8
【解析如下】:
M1:        格式代码
WAKEFIELD/DARREN:旅客姓名
MR:        旅客性别
EOOPCPW:    系统生成的旅客订座记录PNR编码,见注1
ORDLASAA:
   ORD: 始发地城市三字代码,ORD对应为芝加哥,美国
   LAS:  目的地城市三字代码,LAS对应为拉斯韦加斯,美国
   AA:    航空公司IATA二字代码,AA即美国航空公司AMERICAN AIRLINES。
2537:    对应航班号2537,若是三位数字则前加0补全为4位数字。其中,第四位数字7为单数表示为去程航班。见注2
299A003B0070:
   299:  是儒略日(JULIANDAY)计数时间,也就是从当年1月1日开始算起的第299天,即10月26日。
   A:      舱位等级。
   003B:    座位号。
   0070:    顺序号,即第54个办理Check-In的旅客。
13B>10B: 版本号与可变字段长度等。
0299BAA:    
   0299:    0为2010年,299是儒略日(JULIANDAY)计数时间,即10月26日
   B:         资料类型
   AA:       航空公司IATA二字代码,AA即美国航空公司AMERICAN AIRLINES。
2900116052416060:
   29:      结构化信息的字段大小
   001:    航空公司数字代码,001即美国航空公司AMERICAN AIRLINES。
   16052416060:文档格式/序列号/文档验证码
AA:        市场运营商代码,这里是AA即由美国航空公司AMERICAN AIRLINES自营。
QF**8560:    Frequent flyer,即常旅客编号。

—————————————————————-

[注1]:PNR是旅客的订座信息在民航客运销售系统中的记录代码,即英文Passenger Name Record的缩写,它反映了旅客的航程、航班座位占用的数量及旅客信息。PNR编码共有五位组成,第一位由字母组成,其余四位由字母或1-9的任意数字组成,编码中只存在数字0,不存在字母O。
[注2]:国际航班编号一般是由执行该航班任务的航空公司的二字英文代码和三个阿拉伯数字组成。第一个数字表示执行航班任务的航空公司数字代码,第三个数字为单数表示去程航班,双数为回程航班。


3.2   实例2:加拿大航空登机牌


   在Google上随意搜索一张加拿大的机票登机牌,基于PDF417的二维码,如下图所示:

读取上图中登机牌的编码(红色框),获得如下串码数据:
M1SMITH/JOHN MR DXAJGR YYCYVRWS 0553 006Y004D0001 100
【解析如下】:
M1:        格式代码
SMITH/JOHN:旅客姓名
MR:        旅客性别
DXAJGR:   系统生成的旅客订座记录PNR编码
YYCYVRWS:  
   YYC:    始发地城市三字代码,YYC对应为卡尔加里,加拿大。,
   YVR:    目的地城市三字代码,YVR对应为温哥华,加拿大。
   WS:     WS即加拿大西捷航空。
0553:   对应航班号0553。
006Y004D0001:
  006:        是儒略日(JULIANDAY)计数时间,这里就是从当年1月1日开始算起的第6天,即1月6日。
  Y:        舱位等级,属于经济舱。
  004D:    座位号
  0001:    即第1个办理Check-In的旅客。
100:       1是旅客状态定义码,默认为1,后面是航空公司备用代码,一般都是00。

—————————————————————-


3.3  实例3:国内城市间登机牌


   贡献下自己去北京参加 KCON 2015 黑客大会的登机牌,哈,再次感谢COS的盛情,这张是基于Code128的一维码,见下图:

读取上图中登机牌一维编码(红色框),获得串码数据如下:

CA1510 2129LHGH072

【解析如下】:
CA:   CA即国航。
1510: 对应航班号。
21:    当月的日期。
29L:  座位号。
HGH:始发地城市三字代码,HGH对应为杭州。
072:  即第72个办理Check-In的旅客。

—————————————————————-


比起二维码,一维码的内容是不是很简单?
关注公众号,继续追看《BCPB登机牌安全研究の第二弹》

文章原文链接:https://www.anquanke.com/post/id/84389