상용 제품에 Raspberry Pi를 사용하고 싶지만 장치에서 소프트웨어의 리버스 엔지니어링을 방지하고 싶습니다. 해당 소프트웨어는 Ruby로 작성되었습니다. 최종 사용자는 SD 카드에 물리적으로 액세스 할 수 있으며 Pi에 대한 루트 액세스 권한을 얻을 수있을 정도로 똑똑하다고 가정합니다.
내가 본 것처럼 옵션에는 다음이 포함될 수 있습니다.
- SD 카드의 일부 또는 전부 암호화
- Ruby 코드를 난독 처리하거나 바이트 코드 (JRuby 또는 Rubinius)로 컴파일
암호화가 가장 좋은 솔루션이지만 사용자에게 키를 요구하지 않고 해독하는 방법을 생각할 수 없습니다. 코드 난독 화는 분명히 가능하지만 내 마음에는 덜 안전합니다.
암호를 해독 할 키를 사용자에게 묻지 않고 SD 카드의 일부를 암호화 할 수 있습니까? 아니면 원하는 장치에서만 코드에 액세스 할 수있는 더 좋은 방법이 있습니까?
답변
물론 암호화 된 파일 / 컨테이너 등을 해독 할 수 있습니다. 비밀번호를 묻지 않고. SD 카드에 (암호화 된) 비밀번호를 저장하고 데이터를 해독하는 데 충분합니다. 예를 들어, 쉬운 openssl
데모는 다음과 같습니다.
openssl enc -a -e -salt -aes-256-cbc -pass pass:abc123 -in /tmp/plaintext.txt -out /tmp/ciphertext.enc
openssl enc -d -a -aes-256-cbc -pass pass:abc123 -in /tmp/ciphertext.enc
Pi에 소프트웨어를 설치하는 동안 암호화가 수행되고 런타임에 가능하면 RAM에서 암호 해독이 수행됩니다. 예를 들어, 비밀번호는 의사 난수 시퀀스 번호 (귀하에게 알려짐)와에서 얻은 특정 Pi의 일련 번호를 조합 한 것일 수 있습니다 cat /proc/cpuinfo
. 그런 다음 모든 의사 의도와 목적 ” 암호 “및 전체 암호화 메커니즘의 약점에 해당하는 의사 난수를 저장할 적절한 숨겨진 위치를 찾아야합니다 . 예를 들어 SD의 예비 섹터가 일반적으로 선택되지만 실행 파일 중 하나에 포함시킬 수도 있습니다.
어쨌든 최선의 선택은 소프트웨어를 암호화하고 컴파일하여 소프트웨어에 다른 계층의 난독 화를 추가하는 것입니다.
마지막으로 소프트웨어에 인터넷 연결이 필요한 경우 Pi가 매번 암호를 묻도록 할 수도 있습니다. 여전히 연결 내부에서 비밀번호를 숨겨야 하며 암호화를 https
사용하는 현재 시간을 사용하여 응답 공격으로부터 보호해야합니다 salt
.
소프트웨어를 안전하게 만들 수있는 많은 옵션이 있습니다. 그러나 소프트웨어가 잘 정의 된 인기 임계 값에 도달하면 보호에 상당한 양의 돈을 투자하더라도 확실히 금이 갈 것입니다.
답변
코드와 키는 SD 카드 기계에있는 경우 실제로, 그들은 것입니다 그들은 그것을 해제 컴파일 할 수있을 것입니다 열쇠를 발견 할 수 있어야하고, 그들은 것 민감한 데이터를 추출 할 수 있습니다.
영화를 암호화하는 것과 마찬가지로 DVD에는 영화를 해독하는 데 필요한 모든 정보가 포함되어 있어야 시청자에게 표시 할 수 있으므로 모든 영화 복사 방지 메커니즘이 완전히 사라집니다.
최선의 방법은 제품 리버스 엔지니어링의 경제성을 바꾸는 것입니다.
암호화 및 / 또는 난독 화는 그만한 가치가 있습니까?
이제 우리는 자신을 완전히 보호 할 방법이 없다는 것을 알게되었습니다.
- 이것이 일어날 가능성은 얼마나됩니까?
- 알고리즘 및 데이터의 다른 사람에게 어떤 가치가 있습니까?
- 소프트웨어를 사용하기 위해 라이센스를 구매하는 비용은 얼마입니까?
- 알고리즘과 데이터를 복제하는 데 드는 비용은 얼마입니까?
- 알고리즘과 데이터를 리버스 엔지니어링하는 데 드는 비용은 얼마입니까?
- 알고리즘과 데이터를 보호하는 데 드는 비용은 얼마입니까?
이들이 알고리즘 / 데이터를 보호하기 위해 경제적으로 중요한 명령을 내린다면 그렇게해야합니다. 예를 들어, 서비스 가치와 고객 비용이 모두 높지만 코드를 리버스 엔지니어링하는 비용이 코드 자체 개발 비용보다 훨씬 낮은 경우 사람들이 시도 할 수 있습니다.
그래서 이것은 당신의 질문으로 이어집니다.
- 알고리즘과 데이터를 어떻게 보호합니까?
난처
코드를 난독 처리 할 것을 제안하는 옵션은 위의 경제학을 어지럽 힙니다. 비용을 크게 늘리지 않고 비용을 크게 늘리려 고합니다 (5). 문제는 DVD 암호화와 마찬가지로 실패로 끝날 것이며 3, 4 및 5 사이의 차이가 충분하다면 결국 누군가가 그것을 할 것입니다.
또 다른 옵션은 Steganography 형식 일 수 있으며 ,이를 통해 코드를 해독 한 사람을 식별하고 배포를 시작할 수 있습니다. 예를 들어, 데이터의 일부로 100 개의 서로 다른 부동 소수점 값 이 있고 해당 값 각각의 LSB 에서 1 비트 오류로 인해 응용 프로그램에 문제가 발생하지 않으면 고유 한 (각 고객에게) 식별자를 해당 비트로 인코딩하십시오. . 문제는 누군가 응용 프로그램 데이터의 여러 복사본에 액세스 할 수있는 경우 다른 점이있어 숨겨진 메시지를 쉽게 식별 할 수 있다는 것입니다.
보호
실제로 안전한 유일한 옵션은 소프트웨어 를 응용 프로그램에 포함시키지 않고 서비스로 소프트웨어의 중요한 부분을 제공하는 것입니다.
개념적으로 응용 프로그램은 알고리즘을 실행하는 데 필요한 모든 데이터를 수집 하여 클라우드 의 서버에 대한 요청으로 패키지화하고 (귀하가 제어하는) 서비스는 결과를 계산하여 클라이언트에 다시 전달합니다. 표시됩니다.
이렇게하면 모든 독점 기밀 데이터 및 알고리즘을 사용자가 완전히 제어하는 도메인 내에 유지하고 클라이언트가 추출 할 가능성을 제거합니다.
명백한 단점은 클라이언트가 서비스 제공에 묶여 있고 서버와 인터넷 연결에 달려 있다는 것입니다. 좋은 점은 버그 수정으로 항상 최신 상태입니다. 불행히도 많은 사람들 이 이러한 이유로 정확히 SaaS 에 반대합니다 .
이것은 취해야 할 큰 단계이며 6 위의 비용이 많이 들지만 알고리즘과 데이터를 완전히 보호 하는 유일한 방법 입니다.
답변
나는 최근 에이 해결할 수없는 문제에 대한 매우 우아한 해결책을 발명했습니다. 이 xkcd 만화에서 영감을 얻었습니다.
따라서이 솔루션을 수퍼 접착제 라고 합니다. 하나의 superglue SD 카드를 PI에 손상시키지 않으면 카드를 추출하는 것이 거의 불가능합니다.
SD에 저장된 암호로 암호화 된 외부 SSD 디스크를 사용할 수도 있으며 안전하다고 느낄 수 있습니다!
답변
바이트 코드로 컴파일하는 것이 가장 좋은 방충제입니다. 암호화는 소프트웨어가 TrueCrypt 볼륨에 저장 될 수 있지만 사용자가 루트 액세스 권한을 얻지 못한 경우에만 가능합니다. 검사를 위해 언제든지 메모리 / 디스크를 덤프 할 수 있으므로 비밀번호를 안전하게 저장할 수있는 방법이 없습니다. 사용자가 많은 리눅스 유틸리티를 가지고있는 곳에서 소프트웨어를 실행하는 경우 보안 장치 (스마트 카드)의 도움조차별로 도움이되지 않습니다. 내가 아는 한 보안 부팅은 R-Pi의 옵션이 아니기 때문에 OS 내부에서 사용자가 땜질하는 것을 막을 수 있습니다.
답변
진정한 상용 응용 프로그램을 만들고 싶다면 최종 사용자 양식으로 Pi가 적합하지 않습니다!
자체 PCB를 설계하고, Pi에있는 프로세서를 사용하고, 플래시 메모리를 PCB에 내장해야합니다.
- 다음 10 초 이내에만 사용할 수있는 일급 비밀 알고리즘을 기반으로 단일 로그온 코드를 생성 한 BCM에 적합한 펌웨어를 작성하십시오.
- 적절한 소프트웨어를 사용하여 커널을 컴파일하고 소프트웨어의 암호화 된 다른 파티션이 포함 된 플래시의 암호화 된 파일에서 루트를 마운트 할 수있는 Linux 기능을 활성화하십시오. (이중 보호)
- BCM 펌웨어는 일부 영리한 알고리즘 또는 공개 키를 기반으로 인증 키를 한 번만 사용하여 일급 비밀을 생성하고이를 사용자 지정 Linux 커널에 전달합니다.이 커널은 암호화 된 루트 파티션을로드하고 부팅 중에 암호화 된 소프트웨어 드라이브를로드하기 위해 암호화 작업을 수행합니다. 암호화 된 이미지 내에서.
팁
- 올바른 인증 키는 8-16 자 길이가 아닙니다. 시스템 더 많은 시스템 기호 (HEX) 및 더 적은 문자 (ASCII)를 사용하여 256/512 바이트 길이의 인증 키를 제공하는 것이 중요합니다
- 쉽게 갈라지기 때문에 AES, TKIP를 사용하지 마십시오
- 현재 월풀 암호화는 256/512 키를 사용하여 해독하기가 가장 복잡합니다.
- 해커가 플래시 드라이브를 제거하거나 내용을 덤프 할 수있는 경우에도 마찬가지입니다. 소프트웨어가 두 번 암호화됩니다.
- 인증 키를 가로 채면 펌웨어에서 나가기가 매우 어렵습니다 (BCM이 펌웨어 덤프를 막을 수 있기 때문에)
- 일부 영리한 플래시 ROM에는 전체 메모리 덤프를 방지하는 기능이 있습니다.
- PCB를 설계하는 경우 모든 암호화 데이터와 키를 제공하고 무차별 시도를 방지하는 보안 칩 (Dell 및 Apple 등)을 구현합니다. 일부 Dell은 군용으로 자체 파괴를합니다. BIOS 암호를 2 번 잘못 입력하면 분산 폭탄으로 드라이브가 지워집니다. 인증 키 조작을 감지하면 동일하게 구현할 수 있습니다.
하루의 끝. Raspberry Pi는 어린이가 Linux를 사용하고 일부 프로그램을 작성하는 방법을 배우기위한 교육용입니다.
상업적인 용도로는 적합하지 않습니다. 자신의 장치를 만들고 자신의 보호 시스템을 만들어야합니다. 당신과 다른 누구도 당신이 당신의 타당성 정보를 어떻게 보호하는지 알지 못한다면 누군가가 알려진 익스플로잇 또는 무차별 공격을 이용하여 그것을 해킹 할 가능성은 0.001 %입니다.
대안
- 소프트웨어를 바이너리 형식으로 대상 시스템에 컴파일하고 배포 할 수 있도록 작성하십시오. .NET, JAR for Java 또는 Linux에서 실행되는 Windows의 EXE 예 (Linux, 확실하지 않습니까?)
- 원하는 보안 수준이 높을수록 더 많은 비용을 지출해야합니다. 예외는 없습니다.
답변
해결책 중 하나는 주어진 Pi에 대해 거의 고유 한 RaspberryPi의 MAC 주소를 사용하는 것입니다. 코드 내에서이 주소를 확인하고 컴파일 된 버전을 제공하십시오. 이것은 리버스 엔지니어링을 어렵게 만듭니다.
SD 카드를 맹목적으로 새 카드에 복사하는 사람들에게는 다른 Pi에서 작동하지 않습니다. 이로 인해 대다수의 사람들이 소프트웨어를 훔치 게됩니다. 이것을 깨뜨리기에 충분히 똑똑한 다른 사람들은 소프트웨어를 리메이크하기에 충분히 똑똑 할 수 있습니다.