Firefox 보안 지침
목적
이 문서는 Firefox와 Thunderbird와 같이, 모든 클라이언트 애플리케이션에 일반적으로 적용되는 보안 지침을 간략하게 설명합니다.
안전한 코딩 원칙
애플리케이션이 아래 OWASP 보안 코딩 원칙을 따르는지 확인하십시오.
- 공격 노출 영역 최소화
- 보안 기본값 설정
- 최소 권한의 원칙
- 심층 방어의 원칙
- 안전한 실패
- 서비스를 믿지 마라
- 보안을 단순하게 유지하라
- 보안 문제를 올바르게 해결하라
입력 유효성 검사
-
애플리케이션이 사용자 입력을 받나요?
- 사용자 데이터를 받을 때 적정한 최댓값이 적용되는지 확인하기 위해 입력 위치를 샘플링하여 확인하세요.
- 애플리케이션이 허용된 문자 집합만 입력받는지 확인하기 위해 입력 위치를 샘플링하여 확인하세요.
- 거부 목록 대신 허용 목록을 사용하는지 확인하세요.
-
애플리케이션이 어떤 방식으로든 사용자의 입력을 화면에 표시하나요?
- 응답에서 사용자가 제공했던 콘텐츠가 올바르게 인코딩되었는지 확인하기 위해 입력과 출력 위치를 샘플링하여 확인하세요.
Chrome JS - 위험한 함수
다음 함수 중 사용하고 있는 것이 있나요?
그렇다면 함수가 안전한지 확인하고 더 나은 대안이 있는지 확인하세요.
이름 | 위험 수준 | 문제 | 해결 방법 |
---|---|---|---|
eval | 매우 높음 | JavaScript 파서를 호출하기 때문에, 신뢰할 수 없는 입력과 함께 사용하면 위험합니다. | 가능하다면 항상 eval을 사용하지 마세요. |
setTimeout(string, time) | 매우 높음 | eval처럼 동작합니다. | setTimeout(function, time, param1, param2, …)을 사용하세요. |
C++ - 위험한 함수
다음 함수 중 사용하고 있는 것이 있나요?
그렇다면 함수가 안전한지 확인하고 더 나은 대안이 있는지 확인하세요.
이름 | 위험 수준 | 문제 | 해결 방법 |
---|---|---|---|
gets | 매우 높음 | 경계 검사 없음 | gets를 사욜하지 마세요. 대신 fgets를 사용하세요. |
strcpy | 매우 높음 | 경계 검사 없음 | strcpy는 소스 문자열이 상수이고, 대상이 이를 수용할 만큼 큰 경우에만 안전합니다. 그렇지 않으면 strncpy를 사용하세요. |
sprintf | 매우 높음 | 경계 검사 없음, 형식 문자열 공격 | sprintf는 안전하게 사용하기 매우 어렵습니다. 대신 snprintf를 사용하세요. |
scanf, sscanf | 높음 | 경계 검사가 없을 수 있음, 형식 문자열 공격 | 모든 % 지시어가 해당 인수의 유형과 일치하는지 확인하세요. 경계 검사 없이 '%s' 지시문을 사용하지 마세요. x가 해당 인수의 버퍼 크기인 '%xs'를 사용하세요. 형식 문자열에 신뢰할 수 없고 검증되지 않은 데이터를 사용하지 마세요. |
strcat | 높음 | 경계 검사 없음 | 입력 크기가 잘 알려져 있지 않고, 고정되어 있지 않으면 strncat를 대신 사용하세요. |
printf, fprintf, snprintf, vfprintf, vsprintf, syslog | 높음 | 형식 문자열 공격 | 형식 문자열에 신뢰할 수 없고 검증되지 않은 데이터를 사용하지 마세요. 형식 문자열이 웹 콘텐츠나 사용자 입력의 영향을 받을 수 있는 경우, 이러한 함수를 호출하기 전에 % 지시문의 적절한 수와 유형을 확인하세요. 대상 크기 인수가 올바른지 확인하세요. |
strncpy, fgets, strncat | 낮음 | null 종료가 없을 수 있음 | 항상 대상 버퍼를 null 통해 명시적으로 종료하세요. 크기 인수가 올바른지 확인하세요. null 문자를 추가할 공간을 대상 버퍼에 남겨두세요! |
URL
-
애플리케이션이 신뢰할 수 없는 데이터를 사용하여 URL을 구성하나요?
- 이런 데이터는 사용하기 전에 불필요한 부분은 적절히 삭제하고, 인코딩하세요.
- 사용하거나 저장하기 전에 이런 URL에서 얻은 데이터를 확인하세요.
-
애플리케이션이 리다이렉션을 따르나요?
- 원본 요청 URI뿐만 아니라 리다이렉션에 대해서도 보안 검사가 수행되는지 확인하세요.
보안 제어
-
애플리케이션이 적절한 권한 검사를 구현하나요?
- API가 사용 가능한 곳에서 사용 되는지 확인하세요. (예: shouldload, 등)
- 애플리케이션이 안전하게 실패하는지 확인하세요.
원격 시스템 접근
- 애플리케이션이 원격 시스템에 접근하나요?
- TLS를 사용하지 않을 타당한 이유가 없는 한 TLS를 사용하세요.
- 사용자 동의 없이 사용자 정보가 전송되지 않도록 하세요.
정보 저장
-
파일 저장소
-
애플리케이션은 생성된 모든 파일이 허용된 경로에 있는지 확인해야 합니다.
-
파일 이름이 신뢰할 수 없는 데이터로 만들어지나요?
- 데이터가 적절하게 인코딩되었는지 확인하세요.
-
파일이 허용 가능한 유형인지 확인하세요.
-
파일은 어느 정도의 크기 제한을 초과할 수 없습니다.
-
-
데이터베이스 저장소
- 데이터베이스로 전송된 신뢰할 수 없는 정보가 적절하게 삭제되었는지 확인하세요.
- 가능하다면 주입 공격을 방지하기 위해 타입 안전 매개변수화를 사용하세요.
-
민감한 정보
- 보안에 민감한 정보나 개인 정보가 적절하게 보호되는지 확인하세요(암호화 구획 참조).
- 자격 증명(비밀번호 등)은 특별히 주의를 기울여야 합니다. 이러한 유형의 정보로 작업할 때 무엇을 해야 할지 확실하지 않다면, 누군가에게 물어볼 가치가 충분히 있습니다.
-
로그
- 위의 규칙은 일반적인 애플리케이션 데이터뿐만 아니라 로그에도 적용된다는 점을 잊지 마세요.
암호화
- 애플리케이션이 암호화를 사용하나요?
- 사용된 알고리즘은 인정된 표준인가요?
서비스 거부
-
애플리케이션이 아래 항목에 대한 고갈을 보호하는지 확인하세요.
- 시스템 메모리
- 저장소
보안 경고
-
애플리케이션이 사용자에게 보안 경고를 표시하나요?
-
명확하게 이해할 수 있고 적절한 경고인가요?
-
신뢰할 수 없는 데이터가 사용자에게 보내지는 메시지의 의미를 바꿀 수 있나요?
- 사용자 입력이 메시지의 의미를 변경할 수 있나요?
- 사용자 입력이 시스템 메시지를 화면에서 강제로 표시되지 않도록 할 수 있나요?
- 사용자 입력에 메시지의 의미를 변경할 수 있는 특수 문자가 포함될 수 있나요? (예: 쓰기를 오른쪽에서 왼쪽으로 재설정하는 유니코드 U+202E)
-
공격자가 대화 상자의 타이밍을 이용하여 사용자가 의도하지 않은 항목을 클릭하도록 속일 수 있습니까?
정보 공개
- 애플리케이션이 사용자를 위험에 빠뜨리게할 수 있는 정보를 공개하나요?
- 애플리케이션이 공개할 필요가 없는 정보를 공개하나요?
- 애플리케이션이 사용자를 놀라게 하거나 화나게 할 수 있는 내용을 공개하나요?
프런트엔드
-
XUL과 HTML UI 요소를 생성하는 데 안전한 메커니즘이 사용되나요?
- 예를 들어, innerHTML이나 이와 유사한 기능 대신 createTextNode를 사용하세요.
-
애플리케이션이 자체 docshell(탭, iframe)을 생성하나요?
- docshell의 유형을 명시적으로 나타내는지 확인하세요. 예: iframe.setAttribute("type", "content")