MemGuard
민감한 정보를 메모리에 안전하게 저장하기 위한 소프트웨어 엔클레이브(Enclave)입니다.
이 패키지는 메모리 내에서 민감한 데이터가 노출될 가능성을 줄이기 위해 설계되었습니다. 모든 주요 운영체제를 지원하며 순수 Go로 작성되었습니다.
특징
- 민감한 데이터는 XSalsa20Poly1305로 암호화 및 인증되어 메모리에 저장됩니다. 사용된 방식은 콜드 부트 공격(Cold-boot attack) 방어도 제공합니다.
- 메모리 할당은 시스템 호출(System call)을 사용하여 커널에 직접 리소스를 요청함으로써 언어 런타임을 우회합니다. 이로 인해 가비지 컬렉터의 간섭을 피할 수 있습니다.
- 평문 데이터를 저장하는 버퍼는 가드 페이지(Guard page)와 카나리 값(Canary value)으로 보강되어, 의도하지 않은 접근 및 오버플로를 탐지합니다.
- 민감한 데이터가 디스크에 기록되는 것을 방지하기 위해 노력합니다. 여기에는 스와핑을 방지하기 위한 메모리 잠금, 코어 덤프 처리 등이 포함됩니다.
- 커널 수준의 불변성(Immutability)을 구현하여, 보호된 영역을 수정하려는 시도가 발생하면 접근 위반(Access violation)을 일으킵니다.
- 여러 엔드포인트를 통해 세션 정리 및 안전한 종료 기능을 제공하며, 잔여 데이터가 남지 않도록 시그널 처리를 지원합니다.
- 데이터 복사 및 비교를 상수 시간(Constant-time)에 수행함으로써 부채널 공격(Side-channel attack)을 완화합니다.
일부 기능은 libsodium에서 영감을 받았습니다. 이에 감사드립니다.
전체 문서 및 API 개요는 여기에서 확인할 수 있습니다. 흥미롭고 유용한 코드 샘플은 examples 서브패키지에서 찾을 수 있습니다.
설치
$ go get github.com/awnumar/memguard
API는 실험적이며 불안정한 변경사항이 있을 수 있습니다. 버전을 고정하는 것이 좋습니다. [모듈(Modules)]
기여 방법
./examples 에 프로그램 샘플 제출
- 버그, 취약점, API 사용 시 어려움 보고
- Memguard를 활용하는 유용한 보안 및 암호화 라이브러리 작성
- 커널별/CPU별 보호 기능 구현
- 성능 개선 제출
이슈는 버그 보고 및 제안 논의를 위한 용도입니다. Pull Request는 master 브랜치로 보내주세요.