간결한 질문: 시스템을 다른 컴퓨터에 복사하여 실행하는 것이 불가능하도록(매우 어렵도록) 파티션 암호화를 하드웨어에 연결하는 것이 가능합니까?
전체 이야기: 장치 내부에서 Linux가 실행되는 소형 임베디드 PC를 개발했습니다. 장치가 켜지면 내장된 PC가 실행되어 전원이 꺼질 때까지 사용자에게 데이터를 표시합니다.
이 PC의 소프트웨어는 우리의 비즈니스 경쟁 우위이므로 가능한 한 이에 대한 액세스를 방지하고 싶습니다(PS 참조).
그래서 아이디어는 시스템 플래시 메모리 또는 적어도 그 일부를 암호화하는 것입니다. 하지만 이렇게 하면 전체 플래시 메모리를 복사하는 것이 가능해집니다. 그런 다음 다음 아이디어는 암호화를 하드웨어에 연결하는 것입니다. 하지만 어떻게?
추신: 모든 것이 리버스 엔지니어링의 주제라는 것을 알고 있습니다. 하지만 그렇다고 해서 리버스 엔지니어링이 일상적인 제품이 되도록 놔둘 이유는 없습니다.
PPS 저는 표절에 대해 편집증적인 사람은 아닙니다. 불행하게도 우리는 경쟁자들이 그 이름으로 기술을 훔치려고 시도할 것임을 알고 있습니다 =)
답변1
다음을 사용하여 암호화된 데이터를 특정 장치에 바인딩할 수 있습니다.신뢰할 수 있는 플랫폼 모듈(총 생산 관리). 이런 일들이 꽤 흔해졌습니다x86과거의 노트북도 많은 서버에 설치할 수 있습니다.
TPM을 사용하면 모듈에만 존재하는 암호화 키를 생성하고 해당 키를 사용하여 데이터를 암호화할 수 있습니다. 백업할 수 없는 키를 생성하는 경우 해당 키를 통해서만 데이터를 암호화할 수 있습니다. TPM. 그러면 원래 저장 장치를 복사해도 소용이 없습니다. Linux에서는 다음을 사용할 수 있습니다.바지이것을 관리하기 위해.
ARM 플랫폼에서는 저장된 키를 사용하여 비슷한 작업을 수행할 수 있습니다.신뢰 영역, 하지만 자세한 내용은 모르겠습니다.
답변2
플래시 메모리가 내장된 마이크로프로세서는 외부에서 읽을 수 없습니다. 많은 최신 ARM 칩에는 이 기능이 있습니다. 해당 플래시 메모리에는 외부 저장소에 액세스하는 데 필요한 코드와 암호화 키를 넣을 수 있습니다.
답변3
이 경우 내장된 PC가 작동하려면 이러한 비밀을 알아야 하므로 암호화 비밀에 실제로 의존할 수 없으며 공격자도 이를 알 수 있습니다.
한 가지 해결책은 외부에서 읽을 수 없는 비밀을 찾거나 생성하는 것입니다(@psusi가 제안한 것과 유사). 보유하고 있는 하드웨어가 무엇인지 정확히 알지 못하면 권장 사항을 제시하기가 어렵습니다. 어쩌면 프로세서 일련 번호가 좋은 선택일 수도 있지만 JTAG를 통해서도 읽을 수 있는지 궁금합니다.
이 문제를 해결하는 또 다른 방법은 난독화입니다. 암호 해독 프로세스로 시작하는 코드(그리고 암호의 출처를 명확하게 하는 코드)보다는 프로그램의 임의 부분에서 암호를 여러 번 사용하는 코드를 개발해야 합니다. 예를 들어 버퍼 크기를 어딘가에 하드코딩하는 대신 프로세서 일련 번호의 n번째 비트에 1000을 곱하여 사용할 수 있습니다. 이렇게 하면 다양한 하드웨어 구성에서 코드가 손상될 수 있으며, 공격자가 어떤 비밀을 어떻게 사용할지 알기 전에 많은 디버깅이 필요합니다.
더 자세한 답변이 필요한 경우 세부정보도 제공해야 합니다. 위협 모델은 무엇입니까(유사한 하드웨어에 대한 불법 복사, 독점 알고리즘 분해 등)? 귀하의 하드웨어는 무엇입니까? 관련 제한 사항은 무엇입니까? (JTAG 핀을 잘라낼 수 없다고 하셨는데요, 그 이유는 무엇입니까?)
답변4
내 서버는 CPU 유형, 사용 가능한 메모리, 네트워크 MAC 주소 등과 같은 하드웨어 데이터를 기반으로 암호화 키를 생성합니다. 이를 통해 컴퓨터는 감독 없이 자체 재부팅할 수 있으며, 디스크를 제거하고 다른 서버에 넣으면 암호를 해독할 수 없습니다. 그 자체.
그러나 임베디드 시스템이나 루트 액세스 권한이 있는 모든 곳에서는 dmsetup table --showkeys
.
그래서 제 생각에는 가장 좋은 선택은 하드웨어에 암호화를 적용하는 것입니다.
두 번째로 좋은 옵션은 위의 명령이 사용된 암호화 키를 쿼리할 수 없도록 어떤 방식으로든 커널을 패치하는 것입니다 dmsetup
. 그리고 키 생성이 커널 자체에 구워져 암호화 키를 얻을 수 없게 될 수도 있습니다. Initramfs에서도 마찬가지입니다.
메모리 덤프에서 그것을 얻는 것은 여전히 가능하지만, 그것이 여전히 당신이 할 수 있는 최선입니다...
물론, 실행 중인 시스템에서 모든 데이터가 암호화되지 않았음을 확인하고 누군가 액세스 권한을 얻어 암호화되지 않은 보기를 복사할 수 있다면 이 모든 것은 의미가 없습니다.