https://www.securecoding.cert.org/confluence/pages/viewpage.action?pageId=35979419
- Page:
- Page:신뢰경계를 넘어온 데이터는 새니타이즈한다.
- Page:문자열을 검증하기 전에 정규화 한다.
- Page:경로이름을 검증하기전에 규범화 한다.
- Page:새니타이즈하지 않은 사용자 입력은 로그에 남기지 않는다.
- Page:ZinputStream에 전달된 파일 크기를 제한한다.
- Page:파일과 경로 이름에 ASCII문자의 일부만 사용한다.
- Page:포맷문자열에 사용자 입력을 포함하지 않는다.
- Page:신뢰하지 않고 새니타이즈하지 않은 데이터를 Runtime.exec()메서드에 전달하지 않는다.
- Page:regex에 전달할 신뢰하지 않는 데이터를 새니타이즈 한다.
- Page:로케일을 설정하기 전에 로케일에 의존하는 데이터에 로케일에 의존하는 메서드를 사용하지 않는다.
- Page:두 데이터 구조간에 문자를 분할하지 않는다.
- Page:검증하기 전에 비문자 코드를 제거한다.
- Page:인코딩을 변경할 때 문자열 데이터를 무손실 변환한다.
- Page:파일이나 네트워크에 입출력할 때 양단에 호환되는 인코딩을 사용한다.
- Page:
- Page:클래스를 초기화할 때 순환을 예방한다.
- Page:자바 표준 라이브러리의 식별자를 재사용하지 않는다.
- Page:향상된 for문의 모든 루프 변수는 final로 선언한다.
- Page:
- Page:메서드가 반환한 값을 무시하지 않는다.
- Page:널 포인터를 역참조하지 않는다.
- Page:배열의 내용을 비교하려면 인자를 두개받는 Arrays.equals() 메서드를 사용한다.
- Page:박싱된 기본형을 비교할 때 == 비교연산자를 사용하지 않는다.
- Page:오토박싱된 기본형의 값이 의도한 형인지 확인한다.
- Page:식 하나 안에서 동일 변수를 두번 이상 쓰지 않는다.
- Page:assert문 안에 부작용이 있는 표현을 사용하지 않는다.
- Page:
- Page:정수오버플로우를 탐지하거나 예방한다.
- Page:동일 데이터에 비트 연산과 수리 연산을 수행하지 않는다.
- Page:나눗셈과 모듈로 연산할 때 0으로 나누지 않게 보장한다.
- Page:unsigned형을 저장하는 정수형 변수는 가능한 모든 값을 표현할 수 있어야 한다.
- Page:정확히 계산해야 할 때는 부동 소수점형을 사용하지 않는다.
- Page:비정규화된 부동 소수점을 사용하지 않는다.
- Page:플랫폼 간 부동소수점 연산의 결과를 동일하게 하려면 strictfp 지시자를 사용한다.
- Page:NaN과 값을 비교하지 않는다.
- Page:부동소수점 입력시 예외적인 값을 확인한다.
- Page:루프카운터 로 부동소수점을 사용하지 않는다.
- Page:부동소수점 상수를 사용해서 BigDecimal 객체를 만들지 않는다.
- Page:부동소수점을 나타내는 문자열을 비교하거나 검사하지 않는다.
- Page:수치형 값을 더 작은 형으로 변환할 때 데이터가 손실되거나 잘못 변환되지 않게 확인한다.
- Page:기본 정수형을 부동 소수점형으로 변환할 때 정밀도 손실을 피한다.
- Page:
- Page:신뢰하는 하위 클래스만 불변 성질을 가진 클래스나 메서드를 상속할 수 있게 한다
- Page:데이터 멤버는 private로 선언하고 접근 메서드를 제공한다.
- Page:상위 클래스를 수정할 때 하위 클래슥 위존하는 불변 성질을 유지한다.
- Page:신규 코드에서 제너릭클래스와 비제너릭 클래스를 함께 사용하지 않는다.
- Page:신뢰하지 않는 코드에 안전하게 객체를 전달 할 수 있게 가변 클래스의 복사 기능을 제공한다.
- Page:반환하기 전에 클래스의 가변 private 멤버를 복사해 보호한다.
- Page:가변 입력가 가변 내부 컴포넌트를 복사해 보호한다.
- Page:기밀 클래스는 복제되지 않아야 한다.
- Page:중첩된 클래스를 통해 private 멤버를 노출하면 안된다.
- Page:클래스를 비교할 때 클래스 이름으로 비교하면 안된다.
- Page:final이 아닌 public static 변수를 사용하지 않는다.
- Page:생성자가 예외를 발생시킬수 있게 할때는 주의한다.
- Page:
- Page:메서드 인자를 검증한다.
- Page:메서드 인자를 검증할 때 절대로 assert를 사용하지 않는다.
- Page:폐지되거나 폐지 예정인 클래스나 메서드를 사용하지 않는다.
- Page:보안 검사하는 메서드는 반드시 private 나 final로 선언해야 한다.
- Page:숨기거나 오버라이드한 메서드의 접근성을 확대하지 않는다.
- Page:오버라이드될 수 있는 메서드를 생성자가 호출하지 않게 보장한다.
- Page:clone()메서드가 오버라이드될 수 있는 메서드를 호출하면 안된다.
- Page:MET07-J. Never declare a class method that hides a method declared in a superclass or superinterface상위 클래스나 인터페이스의 메서드를 가리는 클래스 메서드를 선언하지 않는다.
- Page:동등비교하는 객체는 동등비교할 수 있게 보장한다.
- Page:equals()메서드를 정의하는 클래스는 반드시 hashCode()도 정의해야 한다.
- Page:compareTo()메서드를 구현할 때 일반적인 용법을 지원한다.
- Page:비교연산에 사용하는 키는 불변형이어야 한다.
- Page:finalize() 메서드를 사용하지 않는다.
- Page:
- Page:필수처리 예외를 억제하거나 무시하지 않는다.
- Page:예외에 의해 기밀 정보가 유출되지 않게 한다.
- Page:로그를 저장하는 동안 예외가 발생하지 않게 한다.
- Page:메서드가 실채하면 객체를 이전 상태로 복구한다.
- Page:finally블럭에서 갑작스럽게 빠져나가지 않는다.
- Page:필수처리 예외가 finally 블럭을 빠져나가지 못하게 한다.
- Page:선언하지 않은 예외를 발생 시키지 않는다.
- Page:RuntimeException, Exception, Throwable 예외를 발생시키지 않는다.
- Page:NullPointException과 상위 예외를 잡지 않는다.
- Page:신뢰하지 않는 코드가 JVM을 종료하지 못하게 한다.
- Page:
- Page:공유된 기본형 변수에 접근할 때 가시성을 보장한다.
- Page:불변 객체에 대한 공유된 참조의 가시성을 보장한다.
- Page:공유된 변수에 대한 복합 연산의 원자성을 보장한다.
- Page:독립적으로 호출된 일련의 원자적 메서드 전체를 원자적이라고 가정하지 않는다.
- Page:연결된 메서드를 호출할 때 호출된 전체 메서드의 원자성을 보장한다.
- Page:64비트값을 읽고 쓸 때 연산의 원자성을 보장한다.
- Page:
- Page:LCK00-J. Use private final lock objects to synchronize classes that may interact with untrusted code신뢰하지 않는 코드에 접근하는 클래스를 동기화하려면 private final 락 객체를 사용한다.
- Page:재사용될 수 있는 객체를 이용해 동기화하지 않는다.
- Page:getClass()에 의해 반환된 클래스 객체를 이용해 동기화 하지 않는다.
- Page:상위 수준의 동시성 객체를 이용해 동기화하지 않는다.
- Page:지원 컬렉션에 접근할 수 있을때 컬렉션 뷰로 동기화 하지 않는다.
- Page:신뢰하지 않는 코드가 수정할 수 있는 static 필드를 접근할 때는 동기화 한다.
- Page:공유된 static데이터를 보호하고자 인스턴스 객체를 락으로 사용하지 않는다.
- Page:락을 동일한 순서로 요청하고 해제하여 데드락을 피한다.
- Page:예외 조건 처리시 활성화된 락을 반드시 해제한다.
- Page:락으 활성화한 후 블럭될 수 있는 연산을 수행하지 않는다.
- Page:이중검사 동기화의 잘못된 형태를 사용하지 않는다.
- Page:락 정책을 완전히 구현하지 않은 클래스를 사용할 때 클라이언트 측에서 락하지 않는다.
- Page:
- Page:Thread.run() 메서드를 사용하지 않는다.
- Page:ThreadGroup 메서드를 호출하지 않는다.
- Page:특정 스레드 대신 대기하는 모든 스레드에 노티피케이션을 보낸다.
- Page:wait()와 await()메서드는 언제나 루프안에서 호출한다.
- Page:블럭된 연산을 수행하는 스레드는 종료될 수 있음을 보장한다.
- Page:스레드를 종료하고자 Thread.stop()메서드를 사용하지 않는다.
- Page:
- Page:트래픽이 폭주할 때 성능이 완마니 저하되게 스레드풀을 사용한다.
- Page:스레드 풀 안에서 상호 의존적인 작업을 수행하지 않는다.
- Page:스레드 풀에 들어간 작업은 인터럽트될 수 없음을 보장한다.
- Page:스레드 풀에서 수행되는 작업이 에러 없이 실패하지 않게 보장한다.
- Page:스레드 풀을 사용할 때 스레드 로컬 변수가 다시 초기화 되게 보장한다.
- Page:
- Page:스레드 안전한 메서드를 스레드 안전하지 않은 메서드로 오버라이드하지 않는다.
- Page:객체 생성중 this 참조가 유출되지 않게 한다.
- Page:클래스 초기화 중 백그라운드 스레드를 사용하지 않는다.
- Page:일부분만 초기화된 객체를 공개하지 않는다.
- Page:
- Page:공유 디렉토리에 있는 파일에 작업하지 않는다.
- Page:파일 생성시 적절한 접근 권한을 부여한다.
- Page:파일 관련 에러를 탐지하고 처리한다.
- Page:작업을 종료하기 전에 임시 파일을 삭제한다.
- Page:필요없어진 리소스는 닫는다.
- Page:신뢰하지 않는 코드에 wrap()이나 duplicate() 메서드로 생성한 버퍼를 노출하지 않는다.
- Page:한 InputStream에 여러 버퍼 래퍼를 만들지 않는다.
- Page:외부 프로세스가 입출력 스트림을 기다리게 하지 않는다.
- Page:글자나 바이트를 읽는 메서드의 반환값을 저장하려면 int형을 사용한다.
- Page:0부터 255 이외의 정수를 출력할 때 write() 메서드를 사용하면 안된다.
- Page:read()로 배열을 채울 때 배열이 제대로 채워졌음을 확인한다.
- Page:이진 데이터를 문자 데이터로 읽지 않는다.
- Page:리틀-엔디안 데이터를 읽고 쓰는 메서드를 제공한다.
- Page:신뢰경계 외부에 기밀 정보 로그를 남기지 않는다.
- Page:프로그램을 종료할 때 적절히 정리한다.
- Page:신뢰하지 않는 파일 링크상에서 오퍼레이트 하지 않는다.
- Page:
- Page:클래스를 변경할 때 직렬화 호환성을 유지한다.
- Page:직렬화 메서드의 적절한 시그너처를 유지한다.
- Page:신뢰 겨예 외부로 기밀 객체를 전송할 때 서명하고 봉인한다.
- Page:암호화 안 한 기밀 데이터를 직렬화 하지 않는다.
- Page:보안 관리자를 피해 직렬화 및 역직렬화 할 수 없게 한다.
- Page:내부클래스 객체를 직렬화하지 않는다.
- Page:역직렬화하는 동안 private 가변 컴포넌트는 복사해서 보호한다.
- Page:불변 성질을 갖고 있는 객체는 기본 직렬화 형태를 사용하면 안된다.
- Page:높은 권한을 갖고 있으면 역직렬화하기전에 권한을 최소화 한다.
- Page:readObject() 메서드 안에서 오버라이드될 수 있는 메서드를 호출하지 않는다.
- Page:직렬화하는 동안 메모리와 리소스가 누수되지 않게 한다.
- Page:Externalizable 객체의 내용을 덮어쓰지 못하게 한다
- Page:
- Page:권한이 있는 코드가 신뢰 경계 외부에 기밀 정보를 유출하지 못하게 한다.
- Page:권한이 있는 코드 안에서 신뢰하지 않는 변수를 사용하지 않는다.
- Page:신뢰하지 않는 외부 데이터를 직접 보안 검사하지 않는다.
- Page:신뢰하지 않는 코드가 임의의 클래스를 로드하게 허용한 후 신뢰하는 클래스를 로드하면 안된다.
- Page:보안 관리자 검사를 이용해 기밀 연산을 보호한다.
- Page:리플레션으로 클래스, 메서드, 필드에 접근성을 확대하면 안된다.
- Page:URLClassLoader와 java.util.jar 가 제공하는 기본 자동 서명 검증 기능에 의존하지 않는다.
- Page:사용자 정의 클래스 로더를 작성할 때 상위 클래스의 getPermission()메서드를 호출한다.
- Page:네이티브 메서드에 대한 래퍼를 정의한다.
- Page:
- Page:모든 보안 코드는 단하나의 jar 파일에 넣어서 서명하고 봉인한다.
- Page:환경 변수 값을 신뢰하지 않는다.
- Page:위험한 권한 조합을 부여하지 않는다.
- Page:바이트 코드 검증을 비활성화 하면 안된다.
- Page:원격에서 감시할 수 있는 애플리케이션은 배포하지 않는다.
- Page:
- Page:안전하게 데이터를 교환하려면 Socket대신 SSLSocket을 사용한다.
- Page:빈 무한 루프를 사용하면 안된다.
- Page:강력한 난수를 생성한다.
- Page:기밀 정보는 결코 하드코딩하면 안된다.
- Page:메모리 누수를 시키지 않는다.
- Page:힙 영역을 고갈 시키지 않는다.
- Page:루프에서 나열하는 동안 참조하는 컬렉션을 수정하지 않는다.
- Page:싱글톤 클래스가 여러 객체를 만들지 않게 한다.
Each rule has an assigned priority. Priorities are assigned using a metric based on Failure Mode, Effects, and Criticality Analysis (FMECA) [IEC 60812]. Three values are assigned for each rule on a scale of 1 to 3 for
- Severity - How serious are the consequences of the rule being ignored:
1 = low (denial-of-service attack, abnormal termination)
2 = medium (data integrity violation, unintentional information disclosure)
3 = high (run arbitrary code, privilege escalation)
- Likelihood - How likely is it that a flaw introduced by violating the rule could lead to an exploitable vulnerability:
1 = unlikely
2 = probable
3 = likely
- Remediation cost - How expensive is it to remediate existing code to comply with the rule:
1 = high (manual detection and correction)
2 = medium (automatic detection and manual correction)
3 = low (automatic detection and correction)
The three values are multiplied together for each rule. This product provides a measure that can be used in prioritizing the application of the rules. These products range from 1 to 27. Rules with a priority in the range of 1 to 4 are level 3 rules, 6 to 9 are level 2, and 12 to 27 are level 1. As a result, it is possible to claim level 1, level 2, or complete compliance (level 3) with a standard by implementing all rules in a level, as shown in Figure P-1.
- Severity - How serious are the consequences of the rule being ignored:
'보안 > 시큐어코딩' 카테고리의 다른 글
[시큐어코딩실습] 파일 업로드 취약점제거 (0) | 2013.10.17 |
---|---|
ASP게시판에서 CSRF 취약점 테스트 (0) | 2013.10.02 |
[시큐어코딩] 소프트웨어 개발 보안 과정 참고자료 (0) | 2013.09.10 |
소프트웨어 개발보안(시큐어 코딩) 관련 가이드 (0) | 2013.07.22 |
웹에서 사용되는 인코딩 종류와 암호화 알고리즘 (0) | 2013.07.08 |