컴퓨터 보안 담당자를 위해 언어를 분석 / 감사 할 수있게하십시오.
보안 담당자는 프로그램이 출시되기 전에 프로그램에서 취약점을 찾을 수 있어야합니다. 이상적으로, 우리는 초기에 부름을 받았으며 코드베이스가 개발 될 때 주석을 달 수 있지만 종종 그렇지 않습니다.
언어 나 핵심 라이브러리의 새 버전이 나오면 이전에 안전한 것들이 더 이상 없을 수 있습니다.
- 라이브러리가 더 강력해질 수 있습니다. 예 : 이제 URL 라이브러리가 지원합니다
javascript:
- 문자열이나 바이트를 코드로 변환하는 새로운 방법이있을 수 있습니다 : 예
eval
또는 직렬화 해제 라이브러리
- 언어 반영 기술이 더욱 강력해질 수 있습니다. 예 : 지역 변수 노출
이러한 변경 사항으로 인해 프로그램이 가용 한 권한의 양을 늘릴 수 있지만 프로그램이 사용하는 권한 (악의적이지 않은 클라이언트를 처리 할 때)의 권한이 변경되지 않았기 때문에 보안 담당자는 집중적으로이를 파악하기가 쉽지 않습니다. 재 감사.
따라서 언어를 디자인하고 버전을 지정할 때 우리를 생각하십시오. 다음은 몇 가지 팁입니다.
프로그램을 분해 할 수있는 몇 가지 기본 요소를 정의하십시오.
HTML5는 특히 이런 식으로 나쁩니다. 그들은 분명히 보안에 대해 많은 생각을하고 똑똑한 사람들을 가지고 있지만, <video>
오래된 것과 같은 새로운 프로그램 요소를 지정 하거나 새로운 <video>
것과 오래된 것을 <img>
모두 지정할 수 있는 공통 추상화를 만드는 대신에 <video>
아직 자체 보안 결과가있는 또 다른 일회성 프로그램 요소.
정적으로 입력하지 않아도 언어를 정적 분석에 사용할 수있게하십시오.
보안 담당자는 정적 분석을 사용하여 패턴을 찾고 프로그램의 일부를 배제하여 실제로 까다로운 비트에 집중할 수 있습니다.
어떤 식별자가 지역 변수이고 어떤 식별자가 아닌지는 분명해야합니다.
예를 들어, 구 버전의 JavaScript와 같은 실수를 저 지르지 마십시오 x
. 이전 버전의 스펙을 문자 그대로 읽었을 때 아래의 지역 변수 참조 인지 여부를 알 수 없었습니다 .
if (Math.random() > 0.5) {
Object.prototype.x = 0;
}
function f() {
var x = 1;
(function () {
alert(x); // Might alert 0, might alert 1.
})();
}
분해 가능한 보안 허용
많은 보안 시스템은 보안 속성을 유지하는 보안 커널을 중심으로 설계되므로 보안 담당자는 적은 양의 코드를 분석하고 대부분의 프로그래머가 {성가신, 교육자, 편집증} 보안 담당자를 처리하지 않아도되도록 노력할 수 있습니다. .
귀하의 언어로 그러한 커널을 작성할 수 있어야합니다. 언어의 보안 속성 중 하나가 URL의 특정 하위 집합 만 가져 오게된다면 커널 작성자가 코드를 통해 모든 URL 가져 오기를 수행 할 수 있습니까? 또는 정적 빌드 확인 (예 : 가져 오기 확인)이 동일한 기능을 수행 할 수 있습니다.
Newspeak와 같은 일부 언어는 개체 기능 모델을 사용합니다. 그것은 분해 가능한 보안을 얻는 굉장하고 좋은 방법입니다.
그러나 그렇게 할 수 없다면 모듈 그래프를 정적으로 분석 가능한 아티팩트로 만들면 상당한 이점을 얻을 수 있습니다. 모듈이 TCB의 모듈에서 코드를 호출하는 것을 제외하고 파일 I / O 모듈에 도달 할 수 없음을 증명할 수 있으면 해당 모듈에서 모든 클래스의 문제를 배제 할 수 있습니다.
임베디드 스크립팅 언어의 권한 제한
많은 유용한 시스템은 동적 (심지어 기능적인) 언어로 작성된 많은 코드를 시작하는 정적 코어로 구성됩니다.
또한 스크립팅 언어를 포함하면 시스템을 훨씬 확장 할 수 있습니다.
그러나 스크립팅 언어에는 VM의 모든 권한이 없어야합니다.
내장 된 스크립팅 언어를 허용하도록 선택하면 호출자가 수행 할 수있는 작업을 쉽게 제한 할 수 있습니다. 객체 기능 모델 (위의 Newspeak에 대한 의견 참조)이 여기에 매우 적합합니다. 따라서 스크립팅 언어로 코드를 평가할 때 호출자는 실행할 코드와 해당 코드의 모든 전역 변수를 전달해야합니다.
eval
자체를 스크립팅 언어로 포함하는 언어로 취급
언어에서 자체 컴파일러를 호출하여 문자열을 코드로 변환 할 수있는 경우 내장 된 스크립팅 언어와 같은 방식으로 샌드 박스를 만들 수 있습니다.
간단한 동시성 모델을 사용하십시오.
보안 담당자는 보안 속성이 유지되는지 파악하려고 할 때 경쟁 조건에 대해 걱정할 필요가 없습니다.
거의 불가능한 보안 기본 옵션으로 스레드를 설정하기 전에 스레딩의 대안을 고려하십시오.
간단한 하나는 E, Verilog 및 JavaScript에서 볼 수있는 것과 같은 이벤트 루프 동시성입니다.
인용 혼동을 장려하지 마십시오
일부 언어는 풀 언어이며 많은 다른 언어로 된 문자열을 처리합니다.
예를 들어, JavaScript는 종종 문자열을 HTML, CSS, XML, JSON 및 JavaScript로 구성합니다. 프로그래머가 일반 텍스트 문자열을 조합하여 다른 언어로 문자열을 만들 때 올바르게 인코딩하는 것을 기억하기는 매우 어렵 기 때문에 JS 프로그램은 의심 할 여지없이 모든 종류의 인용 혼동 문제가 있습니다 .XSS가 최악입니다.
문자열 구성 기능 을 포함 하려면 프로그래머의 보안 부담을 줄이십시오. DSL, 위생적 매크로 및 임베디드 템플릿 언어는 라이브러리 나 언어 개발자로의 이탈에 대한 부담을 최종 개발자로부터 멀어지게함으로써이 작업을 수행하는 좋은 방법이 될 수 있습니다.