모든 이야기

Sparse FSM encoding: 상태 비트가 바뀌어도 허용으로 넘어가지 않게

보안 상태 머신에서 한 비트가 바뀌어 ‘검사 중’이 ‘허용’으로 변한다면, 정상 입력의 검증만으로는 그 오류를 설명하기 어렵다. Sparse FSM encoding은 유효 상태를 서로 떨어진 비트열로 배치해, 일부 비트 변화가 다른 유효 상태로 바로 이어지지 않도록 한다. 상태를 표현하는 여유 비트가 오류를 드러낼 공간이 되는 셈이다.

상태 사이의 거리를 직접 센다

설명용 상태 네 개를 6비트로 나타내자. 각 이름의 기능은 임의이고, 코드는 실제 OpenTitan의 상태값이 아니다.

대기: 000111
검사: 011001
허용: 101010
오류: 110100

두 코드의 Hamming distance는 서로 다른 비트의 개수다. 대기와 검사는 XOR 결과가 011110이므로 거리가 4다. 네 상태의 여섯 쌍을 모두 비교하면 거리도 모두 4다. 한 유효 상태에서 비트 하나, 둘, 셋만 반전해서는 다른 유효 코드에 도달할 수 없다.

대기 코드의 마지막 비트 하나를 바꾸면 000110이다. 이는 유효 상태 목록에 없으므로 정확한 코드 일치 검사에서는 invalid로 판정할 수 있다. 여섯 비트 중 세 개까지 반전하는 마스크는 6+15+20=41개이고, 각 유효 상태에서 이 41개를 적용한 결과는 모두 invalid다.

여기서 보장하는 것은 상태 저장 비트의 지정된 반전에 대한 코드 공간의 성질이다. 오류를 원래 상태로 고쳐 주는 기능까지 자동으로 생기지는 않는다. 네 비트를 동시에 바꾸면 다른 유효 상태에 도달할 수 있다. 대기에서 101101 마스크를 적용하면 허용 코드 101010이 된다. invalid 검사만으로는 이 변화를 알 수 없다.

invalid를 발견한 뒤 무엇을 할지도 회로다

OpenTitan의 보안 설계 지침은 상태 사이의 최소 거리와 sparse encoding을 제시하며, 유효하지 않은 상태의 처리와 합성 최적화도 함께 고려하도록 설명한다. OpenTitan Secure Hardware Design Guidelines

가상 회로에서 invalid를 발견하면 alert만 출력하고, 권한 부여 출력은 이전 값을 그대로 유지한다고 하자. 상태를 잘 검출했어도 권한은 계속 열려 있을 수 있다. 반대로 invalid를 가장 높은 권한 상태로 해석하는 default 분기가 있으면 코드의 거리를 둔 목적과 맞지 않는다.

권한이 닫힌 기본 출력, 오류 상태 전이, alert의 저장과 상위 회로의 대응을 함께 정의해야 한다. 어떤 조치를 선택할지는 시스템의 요구에 달려 있다. 모든 오류에 무조건 reset이 최선이라는 의미는 아니다. 그러나 오류가 검출됐다는 표시만으로 민감한 동작이 이미 중단됐다고 추정해서는 안 된다.

검사 시점도 중요하다. 잘못된 상태가 먼저 민감한 출력을 만들고 다음 클럭에서 invalid를 확인한다면, 한 주기 동안의 동작은 따로 평가해야 한다. 저장 코드의 거리와 상태를 해석하는 조합 논리, 최종 허용 신호가 모두 같은 보호를 갖는 것은 아니다.

RTL의 여섯 비트가 실제로 독립적인가

위 예제의 각 유효 코드는 Hamming weight가 3이다. 하지만 weight만 검사하면 모든 유효 코드를 구분하는 것은 아니다. 6비트 중 3개가 1인 비트열은 20개이고, 지정한 유효 코드는 4개다. 나머지 16개도 weight 검사에는 통과한다. 정확한 상태 목록 검사와 weight 검사의 보장 범위를 혼동하면 안 된다.

RTL에 여섯 비트를 선언했더라도 합성 결과에서 같은 함수를 갖는 신호나 저장소가 병합되면, 한 물리 노드의 오류가 여러 코드 비트를 함께 바꿀 수 있다. 이 경우 ‘한 비트 반전’이라는 가정과 실제 하나의 노드 변화가 일치하지 않는다. OpenTitan 지침이 상태 벡터 저장소와 합성 최적화에 주의를 주는 이유도 여기에 있다.

따라서 생성된 netlist에서 저장소와 decode가 어떻게 남았는지 확인하고, 허용한 오류 위치와 개수로 검출 반응을 다시 평가해야 한다. RTL 코드표의 수학적 성질이 최종 회로에 보존됐다는 증거가 필요하다.

Sparse FSM encoding의 가치는 오류가 다른 정상 상태로 숨어드는 경로를 줄이는 데 있다. 코드 사이의 거리, invalid 처리, 실제 저장소를 연결해서 검토하면 무엇을 탐지할 수 있고 어떤 오류는 추가 보호가 필요한지 구체적으로 말할 수 있다.

Sparse FSM encoding: 상태 비트가 바뀌어도 허용으로 넘어가지 않게 · ariser