기기를 회수하지 않고 무선·원격으로 펌웨어를 갱신하는 것 (Over-The-Air update).
왜 필요한가
- 현장에 수천 대가 배포된 기기에 보안 취약점이 발견됐다면?
- 전부 회수해 USB로 업데이트할 수는 없다
IoT 기기의 필수 기능이며, 없으면 보안 패치가 불가능해 규제 대상이 되기도 한다(EU CRA 등).
전체 흐름
반드시 갖춰야 할 것 — 다섯 가지
① 무결성 검증 (CRC/해시)
전송 중 손상을 감지한다. 기록 후에도 다시 읽어 검증해야 한다.
② 진위 검증 (서명)
서버가 개인키로 서명 → 기기가 공개키로 검증 공개키는 부트로더에 내장 (또는 보안 요소에)
서명이 없으면 중간자가 악성 펌웨어를 주입할 수 있다. CRC만으로는 우연한 손상은 잡지만 의도적 위조는 못 막는다.
③ 원자성 — 중단되어도 안전
A/B 뱅크 또는 스테이징 영역 사용 "기록 완료 + 검증 통과" 후에만 전환
전원이 끊겨도 이전 펌웨어로 부팅되어야 한다.
④ 롤백
- 새 펌웨어가 부팅 후 헬스 체크를 통과하지 못하면
- 자동으로 이전 버전으로 되돌린다
부팅은 되지만 통신이 안 되는 펌웨어를 배포하면 원격 복구가 영영 불가능해진다. 롤백이 마지막 안전망이다.
⑤ 버전 관리와 다운그레이드 방지
취약한 구버전으로 되돌리는 공격을 막으려면 버전 번호가 낮은 펌웨어를 거부해야 한다 (anti-rollback counter)
저장 방식 세 가지
| 방식 | 장점 | 단점 |
|---|---|---|
| A/B 뱅크 | 안전, 즉시 롤백 | 플래시 2배 |
| 외부 플래시 스테이징 | 내부 플래시 절약 | 부트로더가 복사해야 함(시간) |
| 직접 덮어쓰기 | 공간 최소 | 위험. 중단되면 벽돌 |
직접 덮어쓰기는 피해야 한다. 부득이하면 최소한 부트로더는 지우지 않도록 보호한다.
델타 업데이트
- 전체 이미지 512KB 대신 차이분 20KB 만 전송
- 대역폭·시간·전력 절감
- 셀룰러 기기에서 통신비가 크게 준다
대신 기기 쪽에서 패치를 적용할 알고리즘이 필요하고, 이전 버전이 정확히 무엇인지 알아야 한다
다운로드 중 고려할 것
✅ 청크 단위 전송 + 각 청크 검증 (재개 가능하게) ✅ 진행률 보고 ✅ 다운로드 중에도 본래 기능을 유지 (또는 안전한 상태로) ✅ 전원 상태 확인 — 배터리가 부족하면 시작하지 않는다 ✅ 재시도와 백오프
"업데이트 중 기기가 멈추는 것" 이 허용되는지가 설계에 큰 영향을 준다. 의료·산업 기기는 대개 허용되지 않아, 안전한 시점에만 재부팅한다.
플래시 수명
플래시 쓰기 횟수는 유한하다 (보통 10,000~100,000회) OTA를 매일 하면 몇 년이면 한계에 도달할 수 있다
대량의 설정 데이터를 플래시에 자주 쓰는 것과 합쳐지면 수명 문제가 현실이 된다. 웨어 레벨링이나 EEPROM 에뮬레이션을 고려한다.
보안 체크리스트
✅ 전송 채널 암호화 (TLS) ✅ 펌웨어 서명 검증 (필수) ✅ 공개키를 안전하게 보관 (부트로더 영역 쓰기 방지, RDP) ✅ 다운그레이드 방지 ✅ 디버그 포트 비활성화 (양산품) ✅ 펌웨어 자체 암호화 (역공학 방지, 선택)
서명 검증을 앱이 아니라 부트로더가 해야 한다. 앱이 이미 손상됐다면 앱의 검증 코드도 신뢰할 수 없기 때문이다.