Chapter 08

프라이버시와 필터링: 해석 목록과 필터 수용 목록

1권 8장은 RPA가 “바뀌는 이름표”라는 것까지 다뤘다. 이 장은 그 이름표를 누가, 어디서, 어떻게 알아보는지 따라간다. 호스트를 깨우지 않고 컨트롤러가 주소를 풀어 걸러 내는 해석 목록, 아는 기기만 받는 필터 수용 목록, 그리고 둘이 겹칠 때의 규칙이다. 펌웨어에서 “본딩한 휴대폰이 다시 연결을 못 한다”는 문제의 대부분이 여기서 나온다.

주소 네 가지와 신원 주소

LE 기기 주소는 48비트이고, 광고 PDU 헤더의 TxAdd/RxAdd 비트가 공개 주소인지 임의 주소인지 알려 준다. 임의 주소는 다시 위 두 비트로 세 가지로 나뉜다.

종류위 두 비트 [47:46]바뀌는가누가 알아보나
공개 주소(IEEE 할당, 구별 비트 없음)바뀌지 않음누구나 같은 기기로 본다
정적 임의 주소0b11전원을 켤 때나 바뀜누구나 같은 기기로 본다
RPA(Resolvable Private Address)0b01주기적으로IRK를 가진 기기만
NRPA (Non-resolvable)0b00주기적으로아무도

공개 주소나 정적 주소 중 하나가 그 기기의 신원 주소(Identity Address)다. 페어링 3단계에서 IRK(Identity Resolving Key)와 함께 신원 주소를 나눠 주면(Identity Information, Identity Address Information), 상대는 앞으로 바뀌는 RPA를 그 신원 주소로 되돌릴 수 있다. 본딩 데이터베이스의 열쇠가 바로 이 신원 주소다.

가면과 암구호

RPA는 매번 바꿔 쓰는 가면이다. 가면 안쪽에는 작은 글씨로 “이 가면의 무늬(prand)를 내 암구호(IRK)로 계산하면 이 숫자(hash)가 나온다”가 적혀 있다. 암구호를 아는 친구만 그 계산을 해 보고 “아, 너구나” 하고 알아본다. 모르는 사람에게는 가면마다 다른 사람으로 보인다.

임의 주소의 하위 종류(Table 1.2): [Vol 6] Part B §1.3.2 · NRPA·RPA 생성 조건: §1.3.2.2 · IRK·신원 주소 배포: [Vol 3] Part H §3.6.4·§3.6.5

RPA를 만들고 푼다: ah 한 번

RPA는 위 24비트 prand와 아래 24비트 hash로 이뤄진다. prand는 위 두 비트가 0b01이고, 나머지 22비트는 무작위(모두 0이나 모두 1은 안 됨)다. hash = ah(IRK, prand)이고, ah는 AES-128 한 블록의 아래 24비트다.

ah(k, r) = e(k, 0¹⁰⁴ ‖ r) mod 2²⁴ · RPA = prand ‖ hash

푸는 쪽은 받은 주소에서 prand를 떼어 내, 알고 있는 IRK마다 ah를 계산해 아래 24비트와 비교한다. 맞는 IRK가 있으면 그 IRK에 짝지어진 신원 주소로 기기를 알아본다. IRK가 열 개면 AES가 최대 열 번이다. 그래서 해석은 사람이 많은 곳에서 빈번하게 돌아가는 계산이고, 컨트롤러가 하드웨어 AES로 대신하는 이유다.

WORKBENCH

RPA 만들기와 풀기

만든 RPA—
받은 주소의 종류—
내 IRK로 해석—
처음 값은 부록 D.7 샘플(IRK ec0234a3…, prand 708194 → hash 0dfbaa)이다. 해볼 것: ① prand의 위 두 비트가 01인지 보자(0x70 = 0111 0000). ② “새 prand” → “받은 주소로”를 누르면 해석된다. ③ “남의 RPA 받기”는 다른 IRK로 만든 RPA다. 종류는 RPA지만 내 IRK로는 풀리지 않는다. ④ 받은 주소의 첫 바이트를 C0 이상으로 바꾸면 정적 주소, 3F 이하면 NRPA로 분류된다.

RPA 생성(prand 조건, prand ‖ hash): [Vol 6] Part B §1.3.2.2 · 해석(localHash 비교): §1.3.2.3 · ah: [Vol 3] Part H §2.2.2 · 샘플: Appendix D.7

RPA 48비트 (MSB → LSB) 01 prand 나머지 22비트 (무작위) hash 24비트 = ah(IRK, prand) prand 24비트 해석 목록 (컨트롤러) 신원 주소 A · IRK_A신원 주소 B · IRK_B… IRK마다 ah(IRK, prand)= 받은 hash 인가?호스트를 깨우지 않는다 같다 → 신원 주소로필터는 신원 주소에 적용 모두 다르다 → 모르는 기기
그림 8-1. RPA를 만들고 알아보기. 위 24비트 prand는 맨 위 두 비트가 01(RPA 표시)이고 나머지는 무작위, 아래 24비트 hash는 IRK로 prand를 계산한 값이다. 받는 쪽 컨트롤러는 해석 목록의 IRK마다 같은 계산을 해서 맞는 것을 찾고, 찾으면 그 신원 주소로 바꿔 필터를 적용한다.

컨트롤러의 해석 목록

호스트가 RPA를 풀면 패킷마다 호스트를 깨워야 하고, 그 전에 컨트롤러가 걸러 버린 패킷은 아예 볼 수 없다(필터 수용 목록에는 신원 주소만 있으니까). 그래서 LL 프라이버시를 지원하는 컨트롤러는 해석 목록(Resolving List)을 갖는다. 레코드 하나는 {상대 신원 주소, 상대 IRK, 내 IRK}다. 해석을 켜면 컨트롤러가 받은 RPA를 풀고, 풀린 패킷에는 필터 수용 목록과 필터 정책을 신원 주소로 적용하며, 호스트에도 신원 주소로 보고한다. 내 IRK가 있으면 컨트롤러가 내 RPA도 직접 만든다.

레코드마다 프라이버시 모드가 있다. 기본값인 네트워크 프라이버시 모드에서는 그 상대가 RPA로 올 때만 받아들이고 신원 주소 그대로 오면 버린다(“이 기기는 늘 RPA를 쓰는데 신원 주소로 왔다면 흉내다”). 기기 프라이버시 모드는 신원 주소와 RPA를 모두 받는다. 상대 IRK를 모두 0으로 넣으면 그 상대는 RPA를 쓰지 않는 기기로 보고 신원 주소만 받는다. 해석은 됐는데 암호화가 실패하면(IRK가 틀렸다는 뜻) 컨트롤러는 지금 RPA를 버리고 새로 만든다.

HCI 명령하는 일
LE_Add_Device_To_Resolving_List레코드 추가(상대 신원 주소, 상대 IRK, 내 IRK)
LE_Set_Address_Resolution_Enable컨트롤러 해석 켜기·끄기(켠 채로는 목록을 바꿀 수 없는 때가 있다)
LE_Set_Privacy_Mode레코드별 네트워크(0x00, 기본)·기기(0x01) 프라이버시 모드
LE_Set_Resolvable_Private_Address_TimeoutRPA를 바꾸는 주기. [v1] 하나의 값(기본 15분), [v2] 최소·최대 범위(기본 8~15분 사이 무작위). 1초~1시간

해석 목록·프라이버시 모드·주소 보고·암호화 실패 시 RPA 교체: [Vol 6] Part B §4.7 · LL 프라이버시: [Vol 6] Part B §6 · 명령: [Vol 4] Part E §7.8.38·§7.8.44·§7.8.45·§7.8.77 · 기기·네트워크 프라이버시 모드 정의: [Vol 3] Part C §10.7

필터 수용 목록과 세 가지 필터 정책

필터 수용 목록(Filter Accept List)은 “아는 기기” 주소 목록이다(예전 이름 White List). 호스트가 정책으로 이 목록을 언제 쓸지 정한다.

SIMULATOR

스캐너 컨트롤러의 하루: 해석 목록과 스캔 필터

스캔 필터 정책
“이어폰”의 프라이버시 모드
받은 광고AdvA해석결과
호스트로 올린 광고—
해석에 쓴 AES—
해석 목록: 이어폰(IRK 있음), 시계(IRK 있음), 옛 키보드(IRK 0, 신원 주소만). 필터 수용 목록에는 셋의 신원 주소가 있다. 주소는 실제 ah로 만들고 푼다. 해볼 것: ① “목록의 기기만”으로 바꾸면 모르는 기기가 사라진다. ② “목록의 기기만”에서 해석까지 끄면 이어폰·시계의 RPA가 목록과 맞지 않아 버려진다. 신원 주소만 아는 필터는 RPA를 알아볼 수 없다. 나를 지정한 시계의 광고도 TargetA를 풀 수 없어 버려진다. ③ 네트워크 모드에서 이어폰이 신원 주소로 광고하면 버린다(해석을 꺼도 모드는 적용된다). 기기 모드로 바꾸면 받는다. ④ 나를 지정한 광고(TargetA = 내 RPA)는 필터 정책과 상관없이 TargetA가 풀릴 때만 받는다.
예측해 보기

스마트 태그가 RPA를 15분마다 바꾸지만, 광고 데이터에 고정된 일련번호 8바이트를 넣고 있다. 지나가는 사람이 이 태그를 하루 종일 따라다닐 수 있을까?

추적하는 사람이 보는 것은 주소만이 아니다.

RPA는 주소만 숨긴다. GAP은 광고 데이터나 스캔 응답이 바뀐다면 주소 변경과 시점을 맞추라고 권한다. 고정 식별자, 바뀌지 않는 이름, 주소를 바꾸는 순간 데이터만 그대로인 것 모두 추적의 단서다. 프라이버시는 컨트롤러 설정과 앱 데이터 설계가 함께 지켜야 한다.

필터 수용 목록: [Vol 6] Part B §4.3.1 · 광고 필터 정책: §4.3.2 · 스캔 필터 정책과 TargetA 규칙: §4.3.3·§4.3.3.1 · 연결 필터 정책: §4.3.4 · 해석 뒤 신원 주소에 필터 적용: §4.7

언제 바꾸나: 주소 변경 주기와 데이터

GAP은 주소를 바꾸는 최대 간격 TGAP(private_addr_int)로 15분을 권한다. 바꾸는 시점이 정확히 15분마다면, 오래 지켜보는 관찰자는 “15분 전 사라진 주소와 지금 나타난 주소가 같은 기기”라고 짝지을 수 있다. 6.1부터는 HCI 명령 [v2]로 최소·최대를 주고 그 사이에서 매번 무작위로 고르게 했고, 기본값도 8~15분 사이 무작위다. 광고 데이터가 바뀐다면 주소 변경과 같은 순간에 바꿔야, 옛 주소와 새 주소를 데이터로 잇지 못한다.

펌웨어 점검표

① 본딩한 상대를 해석 목록과 필터 수용 목록에 함께 넣었나(신원 주소로). ② 해석을 켜 둔 상태에서 목록을 바꾸려다 Command Disallowed가 나지 않나(광고·스캔·연결 시도 중에는 해석을 끄고 바꾼다). ③ RPA를 쓰지 않는 옛 기기는 IRK 0 레코드나 기기 프라이버시 모드로. ④ 광고 데이터의 식별자를 주소 변경에 맞춰 바꾸나.

TGAP(private_addr_int) 15분, 데이터 변경과 주소 변경 맞추기: [Vol 3] Part C §10.8.2·Appendix A · RPA 시간 범위와 [v1]·[v2] 기본값: [Vol 4] Part E §7.8.45 · 6.1 무작위 RPA 갱신: [Vol 1] Part C §15.1

핵심 정리

  1. 임의 주소의 위 두 비트: 11 정적, 01 RPA, 00 NRPA. 공개·정적 주소가 신원 주소이고, IRK와 짝지어 배포한다.
  2. RPA = prand ‖ ah(IRK, prand). 해석은 아는 IRK마다 ah를 계산해 비교하는 것.
  3. 해석 목록 = {상대 신원 주소, 상대 IRK, 내 IRK}. 해석 뒤 필터는 신원 주소로 적용되고 호스트에도 신원 주소로 보고한다.
  4. 네트워크 프라이버시 모드(기본)는 RPA만, 기기 프라이버시 모드는 신원 주소도 받는다. IRK 0 레코드는 신원 주소만.
  5. 스캔 필터와 무관하게 지정 광고는 TargetA가 내 주소이거나 내 RPA로 풀릴 때만 받는다. 주소 변경은 8~15분 무작위, 데이터 변경과 같은 순간에.

확인 퀴즈

임의 주소의 위 두 비트가 0b01이면?

[Vol 6] Part B Table 1.2.

컨트롤러가 RPA를 해석한 뒤 필터 수용 목록과 비교하는 주소는?

[Vol 6] Part B §4.7: 필터 정책은 해석된 뒤 신원 주소에 적용된다.

네트워크 프라이버시 모드의 레코드가 신원 주소로 광고하면?

네트워크 모드는 상대가 배포한 IRK로 만든 RPA만 받는다.

HCI_LE_Set_Resolvable_Private_Address_Timeout [v2]를 지원하는 컨트롤러의 기본 동작은?

[Vol 4] Part E §7.8.45.