NI LabVIEW 데이터 수집, 인스트루먼트 컨트롤, 테스트 자동화에 널리 사용되는 그래픽 프로그래밍 플랫폼입니다. 메모리 안전상 취약점은 많은 기존 소프트웨어 환경에 심각한 영향을 미치지만, LabVIEW 아키텍처와 설계 원칙에 의해 구별됩니다. 이 기술 백서는 LabVIEW 메모리 안전 언어(MSL)로 만드는 메커니즘과 기능, 이러한 속성이 기존 프로그래밍 언어와 어떻게 비교되는지, 강력하고 안정적이며 안전한 어플리케이션을 찾는 개발자에게 미치는 영향에 대해 설명합니다.
메모리 안전은 소프트웨어 보안 및 신뢰성에 있어 매우 중요합니다. 버퍼 오버플로우, 사용 후 사용되지 않는 오류, 기울기 포인터와 같은 클래식 메모리 안전 문제는 C 및 C++와 같은 언어에서 소프트웨어 결함과 보안 취약점의 상당 부분을 초래합니다.1 대신 LabVIEW는 높은 수준의 데이터 흐름 기반 그래픽 환경을 통해 이러한 위험 요소를 제거합니다.
메모리 안전은 프로그램이 잘 정의되고 예측 가능한 방식으로 메모리에 접근하는 것을 의미합니다. 이 구성요소는 의도된 경계 밖의 손상, 누출 및 데이터 쓰기를 방지하는데 도움이 됩니다. 이러한 메모리 문제로 인해 충돌과 정의되지 않은 동작이 발생할 수 있습니다. 더 나쁜 점은, 위협 액터가 메모리 문제를 조작하여 임의의 코드를 실행하여 메모리 버그를 심각한 보안상 취약점으로 만듭니다. 메모리 안전에 대한 우려사항은 다음과 같습니다.
메모리에 직접 접근할 수 있는 언어(예를 들어 포인터 사용)는 이러한 문제에 특히 민감합니다. 반면, 메모리 안전 언어는 개발자의 직접 메모리 관리를 제한하거나 완전히 추상화합니다.
LabVIEW 기본적으로 기존의 텍스트 기반 언어와 다릅니다. 그래픽 프로그래밍 패러다임은 데이터 흐름 원리를 기반으로 하며, 이 때 코드의 실행은 노드 사이의 데이터 흐름(버추얼 인스트루먼트 또는 VI라고 함)에 의해 결정됩니다.
LabVIEW 기본 아키텍처에서 메모리 안전을 향상시키는 요소는 다음과 같습니다.
LabVIEW 기능적인 블록을 데이터를 전달하는 와이어로 연결하여 프로그램을 구성합니다. 각 블록은 모든 필수 입력을 사용할 수 있고 데이터가 생성되기 전에 데이터 위치에 접근할 수 없을 때만 실행되므로 메모리 경합 조건이 발생하지 않습니다.
그림 1. LabVIEW 코드 예
이 모델은 필수 언어에서의 연산의 적절하지 않은 순서로 발생하는 프로그래밍 에러를 자연스럽게 방지합니다.
모든 메모리 할당 및 할당 해제는 LabVIEW 런타임 엔진이 담당합니다. 개발자는 수동으로 메모리를 요청하거나 해제할 필요가 없으므로 누출과 사용 후 에러가 발생할 위험이 없게 됩니다. 배열 또는 클러스터(구조 타입의 데이터)가 커지거나 줄어들면, LabVIEW 관련된 메모리를 투명하게 관리합니다. 예를 들어, 개발자가 배열을 만드는 루프를 생성하는 경우, LabVIEW 자동으로 배열의 크기를 조정하고 관련된 메모리 공간을 관리합니다. 배열 변수가 영역을 벗어나면, LabVIEW 쓰레기 수집기가 메모리를 다시 가져옵니다.
LabVIEW 개발 환경은 VI 컴파일 및 실행 중에 엄격한 타입 검사를 수행합니다. 호환되지 않는 데이터 타입을 함께 연결하려는 시도는 편집 시 발생하여 런타임 에러를 방지합니다. 또한 배열과 문자열 작업에는 버퍼 오버플로우를 방지하기 위해 경계 확인이 포함됩니다.
가장 효과적인 방지 방법 중 하나는 낮은 레벨의 메모리 컨트롤이 없다는 것입니다. LabVIEW 사용자가 임의의 포인터 연산을 수행하거나 메모리에 직접 접근할 수 있는 메커니즘을 제공하지 않습니다. 이 디자인은 스택 또는 히프 오버플로우와 같은 C 또는 어셈블리에 공통적인 취약점이 기본 LabVIEW 코드에서 가능하지 않음을 의미합니다.
LabVIEW 메모리 안전을 보다 잘 이해하려면, 이를 C, C++, Java 또는 Python과 같은 언어와 비교하는 것이 좋습니다.
요약적으로, LabVIEW 설계는 전체 범주의 메모리 관련 취약점(예: 버퍼 오버플로우)을 제거하고, 보안 어플리케이션 개발을 단순화하여, Python 및 Java와 유사한 보호 기능을 제공하는 C 및 C++와 같은 기존 언어에 비해 상당한 이점을 제공합니다.
LabVIEW 메모리 안전은 개발자, 조직, 최종 사용자에게 다음과 같은 실현 가능한 이점을 제공합니다.
기존 버퍼 오버플로우는 데이터가 고정된 길이 버퍼의 경계를 초과하여 인접한 메모리를 덮어쓰고 임의의 코드 실행을 가능하게 할 때 발생합니다. LabVIEW 경우, 배열과 문자열 작업은 항상 경계를 확인합니다. 배열 또는 문자열의 끝을 넘어서 쓰려고 하면 내부적인 메모리 손상이 아닌 런타임 에러가 발생합니다.
모든 메모리 안전 환경에서와 같이 LabVIEW 경계를 이해하는 것이 중요합니다.
외부 코드를 호출할 때 안전성을 극대화하려면 다음 권장 방법을 따르십시오:
그래픽 데이터 흐름 패러다임, 강력한 타입 검사, 자동 메모리 관리, 직접적인 포인터 조작이 없는 LabVIEW 설계는 높은 메모리 안전 환경을 제공합니다. 개발자는 메모리 관련 버그의 위험 감소, 생산성 향상, 안전에 중요한 요구 사항이 높은 업종을 위해 어플리케이션을 확실하게 구축할 수 있는 기능을 활용할 수 있습니다.
특히 안전하지 않은 외부 구성요소와 상호작용할 때 에러가 발생하지 않는 환경은 없지만, LabVIEW 기존의 텍스트 기반 언어에 비해 메모리의 안전성을 크게 높입니다. 측정, 자동화, 컨트롤 어플리케이션에서 안정성과 보안을 확보하고자 하는 조직의 경우, LabVIEW 메모리 안전한 개발을 위한 강력한 선택입니다.
| 외형 | C/C++ | Python/Java | LabVIEW |
|---|---|---|---|
| 메모리 접근 | 메모리 액세스 | 메모리 액세스 없음 | 메모리 액세스 없음 |
| 메모리 관리 | 수동 메모리 관리, 에러 발생 가능 | 자동 메모리 관리 | 자동 메모리 관리 |
| 에러 민감도 | 메모리 안전 에러(예: 버퍼 오버플로우)의 위험이 높음 | 엄격한 타이핑 및 관리형 메모리로 인한 위험 감소 | 엄격한 타이핑 및 관리형 메모리로 인한 위험 감소 |
| 포인터 | 포인터의 광범위한 사용으로 복잡성과 위험성 증가 | 포인터를 직접 사용하지 않음 | 포인터를 직접 사용하지 않음 |
| 보안 | 수동 메모리 핸들링과 버퍼 오버플로우에 취약하기 때문에 높은 공격 표면 | 최소한의 공격 표면, 버퍼 오버플로우 및 포인터 활용에 대해 방지 | 최소한의 공격 표면, 버퍼 오버플로우 및 포인터 활용에 대해 방지 |
Java는 Oracle 및/또는 제휴업체의 등록 상표입니다. 다른 이름은 각 소유자의 상표일 수 있습니다.