재생 가능 보안을 위한 코딩
Important
Azure Sphere(레거시) 설명서입니다. Azure Sphere(레거시)는 2027년 9월 27일에 사용 중지되며 사용자는 이 시간까지 Azure Sphere(통합)로 마이그레이션해야 합니다. TOC 위에 있는 버전 선택기를 사용하여 Azure Sphere(통합) 설명서를 볼 수 있습니다.
재생 가능 보안에 대한 지원은 보안이 높은 디바이스의 7가지 속성 중 하나입니다. Azure Sphere에서는 사용자 고유의 애플리케이션을 포함하여 디바이스의 모든 소프트웨어를 필요에 따라 업데이트하여 새로 검색된 취약성을 해결할 수 있습니다. 보안은 Azure Sphere가 존재하는 이유이며, 항상 디바이스를 안전하게 유지하는 것이 가장 중요하다는 점을 너무 자주 강조할 수 없습니다. 완전히 안전한 코드를 작성할 수는 없지만 좋은 코딩 방법, 새로 검색된 취약성에 대한 대응에 대한 매우 근면성 및 재생 가능한 보안에 대한 헌신을 통해 높은 수준의 애플리케이션 코드가 가능한 한 안전하게 보호되도록 할 수 있습니다. Azure Sphere 애플리케이션 격리 모델은 다음과 같은 다양한 기능을 제공합니다.
- 모든 앱을 설치하거나 실행하려면 먼저 적절하게 서명해야 합니다.
- 애플리케이션의 앱 매니페스트 파일에 지정된 하드웨어 기능 및 인터넷 주소만 애플리케이션에서 액세스할 수 있습니다.
- Azure Sphere SDK에서 제공하는 API에는 표준 C 라이브러리의 하위 집합이 크게 감소하여 사용자 계정 및 셸 액세스와 같은 잠재적인 보안 허점을 생략합니다.
- 보안 문제가 식별되고 해결될 때 Azure Sphere 보안 서비스를 사용하여 Azure Sphere OS 및 고객 애플리케이션을 안전하게 업데이트할 수 있습니다.
그러나 코드 서명 및 공격 표면 최소화는 지금까지만 수행됩니다. 보안 소프트웨어 개발을 위한 모범 사례 집합을 따르면 서명하는 애플리케이션이 가능한 한 안전하고 안전한지 확인하는 데 도움이 될 수 있습니다. 이 문서에서는 Azure Sphere 팀이 자체 개발 사례에서 사용하는 몇 가지 도구에 대해 설명합니다.
정기적인 배포 예약
Azure Sphere OS 및 Azure Sphere SDK는 적어도 분기별로 업데이트됩니다. 사용자 고유의 애플리케이션 배포에 대해 비슷한 일정을 목표로 해야 합니다.
도구 체인이 최신 상태로 유지되는지 확인
Azure Sphere OS 및 SDK는 Azure Sphere 도구 체인의 상당 부분을 구성하지만 별도로 관리하는 다른 구성 요소가 있을 수 있습니다. 이러한 구성 요소에 대한 업데이트를 정기적으로 확인해야 합니다.
일반적인 취약성 및 노출 (CVE) 은 Azure Sphere를 포함하여 시스템의 보안 취약성을 설명하는 데 사용되는 공개 보고서입니다. Azure Sphere OS 업데이트는 정기적으로 CVE를 처리하고 디바이스를 안전하게 유지하는 데 도움이 됩니다. 가능하면 빌드 파이프라인에서 CVE에 대한 검사를 포함합니다. 보안 업데이트를 추적하는 CISA 홈페이지와 같은 책갈피 사이트입니다. 도구 체인을 업데이트할 때 애플리케이션을 다시 빌드하고 다시 배포합니다.
코딩 표준 전파 및 준수
알려진 표준을 준수하는 코드는 유지 관리가 더 쉽고 검토하기 쉽고 테스트하기 쉽습니다. C에 대해 공개적으로 사용할 수 있는 코딩 표준이 있습니다. MISRA는 잘 확립되어 있으며 CERT에는 C에 대한 코딩 표준도 있습니다. 이러한 기본 표준 외에도 가능한 한 보안 개발 수명 주기를 사용하는 것이 좋습니다.
필수 보안 플래그를 사용하여 컴파일하고 있는지 확인합니다.
모든 Azure Sphere 앱은 GCC(Gnu 컴파일러 컬렉션)의 C 언어 컴파일러를 사용하여 빌드됩니다. C 컴파일러 gcc는 수백 개의 컴파일러 및 링커 플래그를 제공합니다. Azure Sphere에서 다음 플래그는 기본적으로 사용됩니다.
-fstack-protector-strong
: 스택 스매싱 공격으로부터 보호하는 코드를 생성합니다.pie
: 위치 독립적 실행 파일을 생성합니다.fPIC
: 위치 독립적 코드를 생성합니다.
플래그는 -fstack-protector-all
보다 -fstack-protector-strong
더 많은 보호를 제공하지만 메모리 스택 사용량이 증가합니다. 현재 Azure Sphere 하드웨어 -fstack-protector-all
의 메모리가 제한되어 있으므로 기본적으로 사용되지 않습니다.
또한 Azure Sphere는 여러 경고 플래그를 사용합니다. 이러한 플래그는 배포 전에 해결할 수 있는 컴파일 중에 코드 문제를 식별하는 데 사용할 수 있습니다.
-Wall -Wswitch -Wempty-body -Wconversion -Wreturn-type -Wparentheses -Wno-format -Wuninitialized -Wunreachable-code -Wunused-function -Wunused-value -Wunused-variable -Wstrict-prototypes -Wno-pointer-sign -Werror=implicit-function-declaration
보안을 -Wl,-z,now
강화하거나 -Wl,-z,relro
추가할 수 있지만, 추가 메모리 사용이 발생하므로 기본적으로 사용되지 않습니다.
모든 코드 검토
코드 검토는 고품질 코드를 보장하는 단순하지만 효과적인 도구입니다. 정규화된 검토자의 코드 검토 없이는 코드를 체크 인하지 않는 것이 좋습니다. 개발자가 다른 개발자와 함께 새 코드를 안내하는 일대일 코드 검토는 종종 원래 개발자가 코드 생성에 들어간 생각을 명확히 하는 데 도움이 됩니다. 이는 검토 개발자의 입력 없이도 디자인 약점 또는 누락된 분기 지점을 표시할 수 있습니다.
자동화된 테스트 사용
gtest와 같은 자동화된 테스트 프레임워크를 사용하면 프로젝트가 빌드될 때마다 테스트 함수 제품군을 실행할 수 있습니다. 모든 체크 인 코드에 하나 이상의 테스트 함수가 함께 제공되는지 확인하는 것이 가장 좋습니다. 더 일반적으로 더 낫다. 테스트의 중요한 유형은 다음과 같습니다.
- 기본 단위 테스트 는 코드의 각 부분을 실행하여 설계된 대로 작동하는지 확인합니다. 테스트 사례는 가장자리에서 코드를 테스트하도록 설계해야 합니다. 코너 케이스 및 에지 사례는 일반적으로 버그의 유익한 소스입니다.
- 퍼지 테스트 는 함수가 적절하게 응답하도록 다양한 형식의 예기치 않은 입력을 제공하여 코드를 연습합니다.
- 침투 테스트 는 공격자가 애플리케이션에 침투할 수 있는 취약성을 식별하는 데 유용합니다.
정적 코드 분석기 사용
정적 코드 분석기는 여러 가지 일반적인 코드 문제를 찾는 데 도움이 될 수 있습니다. 대부분의 경우 특정 유형의 오류에 집중합니다. 다음 무료 및 오픈 소스 도구는 Azure Sphere 개발 팀과 일부 Azure Sphere 사용자가 사용하는 도구 중 하나입니다.
이러한 도구 중 일부를 실행하려면 다른 대상 운영 체제에 대해 애플리케이션(또는 일부)을 다시 컴파일해야 할 수 있습니다.
불필요한 코드 제거
Azure Sphere SDK는 표준 C 개발 라이브러리의 제거된 버전을 제공합니다. 가능한 경우 자신의 코드를 맨손으로 제거할 기회를 찾아야 합니다. 코드 줄이 적을수록 잠재적인 위협에 더 작은 공격 표면을 사용할 수 있습니다. 연결할 수 없거나 사용하지 않는 코드에 대한 경고를 사용하여 불필요한 코드를 식별할 수 있습니다.