프라이빗 데이터 포인터 지원을 위한 보안 다중당사자 컴파일러 확장
초록
본 논문은 기존 PICCO 컴파일러에 프라이빗 데이터에 대한 포인터와 동적 메모리 할당 기능을 추가함으로써, C 프로그램 전반에 걸친 포인터 사용을 안전하게 변환할 수 있게 만든다. 설계·구현·보안 분석과 다양한 데이터 구조에 대한 실험을 통해 성능 오버헤드가 제한적임을 입증한다.
상세 분석
이 연구는 보안 다중당사자 계산(SMC) 환경에서 C 언어의 핵심 기능인 포인터를 지원하기 위한 설계 공간을 체계적으로 탐색한다. 기존 PICCO 컴파일러는 정적 배열 형태의 포인터만을 제한적으로 지원했으며, 동적 메모리 할당과 프라이빗 주소를 갖는 포인터는 전혀 다루지 못했다. 논문은 먼저 “프라이빗 포인터”를 두 종류로 구분한다. 하나는 주소가 공개된(known) 포인터이며, 다른 하나는 주소 자체가 비밀( private)인 포인터이다. 공개 주소 포인터는 기존 메모리 모델에 그대로 매핑할 수 있지만, 비밀 주소 포인터는 여러 가능한 메모리 위치를 동시에 가리키는 형태로 표현한다. 이를 위해 각 포인터를 “위치 집합”과 “선택 비트”의 조합으로 구현하고, 선택 비트를 비밀 공유(secret‑share) 형태로 유지한다.
동적 메모리 할당은 “secure malloc”과 “secure free” 연산을 도입해 구현한다. 할당 시 새로운 메모리 셀을 생성하고, 해당 셀의 인덱스를 비밀 공유값으로 반환한다. 해제는 해당 인덱스를 비밀 공유된 “free list”에 삽입함으로써 수행된다. 이 과정에서 메모리 접근 패턴이 노출되지 않도록 모든 연산을 선형 비밀 공유 위에서 수행하고, 필요한 경우 곱셈 라운드와 재분배를 통해 차수를 유지한다.
포인터 연산(덧셈, 뺄셈, 비교)과 역참조는 각각 비밀 공유된 인덱스 연산으로 변환된다. 특히 역참조는 비밀 주소 집합에 대해 선형 조합을 수행해 실제 값을 얻으며, 이는 ORAM과 달리 접근 횟수가 메모리 크기에 선형적으로 비례한다는 점에서 구현이 단순하지만, 데이터 규모가 작을 때는 충분히 효율적이다.
보안 측면에서는 모든 포인터 연산이 비밀 공유된 형태로 유지되므로, 어느 당사자도 실제 메모리 주소를 알 수 없으며, 시뮬레이션 기반 증명으로 “주소 누설 없음”을 보인다. 또한, 포인터를 이용한 데이터 구조(링크드 리스트, 트리, 스택 등)의 구현이 기존 비밀 연산과 동일한 보안 수준을 유지함을 정리한다.
성능 평가에서는 대표적인 포인터 기반 프로그램(삽입·삭제가 빈번한 리스트, 이진 탐색 트리, 스택 기반 파서 등)을 대상으로 실행 시간과 통신 라운드 수를 측정한다. 결과는 비밀 주소 포인터 사용 시 평균 1.2~1.5배의 연산량 증가가 관찰되었으며, 이는 대부분 선형 연산에 비해 곱셈 라운드가 추가된 결과이다. 데이터 규모가 커질수록 ORAM 기반 접근보다 오히려 더 나은 성능을 보이는 경우도 확인되었다.
전체적으로 이 논문은 포인터와 동적 메모리 할당을 SMC 컴파일러에 통합함으로써, 기존에 제한적이던 C 프로그램의 표현력을 크게 확장하고, 실용적인 보안 프로그래밍 환경을 제공한다는 점에서 중요한 기여를 한다.
댓글 및 학술 토론
Loading comments...
의견 남기기