자바 애플리케이션 취약점 분석: Find Security Bugs
https://find-sec-bugs.github.io/
모바일 애플리케이션 취약점 분석: MobSF
https://github.com/MobSF/Mobile-Security-Framework-MobSF
Sonar Qube
https://www.sonarsource.com/products/sonarqube/
Programing Mistake Detector(PMD)
https://pmd.sourceforge.io/pmd-4.2.6/rules/basic.html
그 외
https://egovframe.go.kr/wiki/doku.php?id=egovframework:dev2:imp:inspection#전자정부_표준프레임워크_표준_inspection_룰셋
이런 링크들을 타고 가서 취약점 분석 도구를 분석.
: Programming Mistake Detector is Java Source Code Analyzer
: 자바 프로그램의 소스코드를 분석하여 프로그램의 부적절한 부분을 찾아내고 성능을 높이도록 도와주는 공개 소프트웨어 점검 도구
: 프로그래머가 자각하지 못한 에러 혹은 위험 요소를 사전에 탐지하여 위험을 미리 제거해주는 강력한 소스 코드 분석기
: 단독 형태로도 쓰이고 eclipse나 IntelliJ와 같은 Java IDE에 플러그인 형태로 배포되어 사용
: 코드의 결함을 탐지하여 사용자에게 리스트를 보여줌, 그러나 리스트가 진짜 결함이라고 단정지을 수 없기에 리스트를 보고 확인 과정을 거치는데 이때 정적 분석 도구가 결함이 아닌 것을 결함으로 탐지해 리스트에 보여주면 오탐지 결과, 즉, False positive를 발생시킨 것
IntelliJ를 사용하여 짧은 코드를 써본 후 PMD를 실행시켜봄


| 번호 | 룰 이름 | 권장방안 |
|---|---|---|
| 1 | EmptyCatchBlock | Catch Block에 반드시 예외를 다루는 코드를 작성 |
| 2 | EmptyIfStmt | 빈 if문 구문의 사용 피하기 |
| 3 | EmptyWhileStmt | 빈 while문 구문의 사용 피하기 |
| 4 | EmptyTryBlock | 내용이 없는 try 블록이 없어야 함 |
| 5 | EmptyFinallyBlock | 내용이 없는 finally 블록이 없어야 함 |
| 6 | UnnecessaryConversionTemporary | 기본 데이터 타입을 String으로 변환할 때 불필요한 임시 변환 작업을 피하기 |
| 7 | EmptyStatementNotInLoop | 필요없는 문장(;)이 없어야 함 |
| 8 | WhileLoopsMustUseBraces | 중괄호없이 사용된 while문의 사용 피하기 |
| 9 | AssignmentInOperand | 피연산자 내 할당문 피하기 (해당 코드 복잡하고 가독성 떨어지게 만듦) |
| 10 | UnnecessaryParentheses | 불필요한 괄호 사용할 경우 메소드 호출처럼 보여서 소스 코드의 가독성을 떨어뜨릴 수 있음 |
| 11 | SimplifyBooleanExpressions | boolean 사용 시 불필요한 비교 연산을 피하기 |
| 12 | SwitchStmtsShouldHaveDefault | switch 구문에는 반드시 default label이 있어야 함 |
| 13 | AvoidReassigningParameters | 넘겨받는 메소드 parameter 값을 직접 변경 X |
| 14 | FinalFieldCouldBeStatic | final field를 static으로 변경하면 overhead를 줄일 수 있음 |
| 15 | EqualsNull | null 값과 비교하기 위해 equals 메소드 사용X |
| 16 | SimpleDateFormatNeedsLocale | SimpleDateFormat 인스턴스를 생성할 때 Locale을 지정 |
| 17 | ImmutableField | 생성자를 통해 할당된 변수를 Final로 선언 |
| 18 | AssignmentToNonFinalStatic | static 필드의 안전하지 않은 사용 가능성이 존재 |
| 19 | AvoidSynchronizedAtMethodLevel | method 레벨의 synchronization보다 block 레벨 synchronization 을 사용 |
| 20 | AbstractClassWithoutAbstractMethod | Abstract Class내에 Abstract Method가 존재X |
| 21 | UncommentedEmptyMethod | 빈 메소드임을 나타내는 주석 추가 |
| 22 | AvoidConstantsInterface | Interface는 클래스의 behavior을 구현하는 데에만 사용 |
| 23 | DuplicateImports | import문 중복된 것 삭제 |
| 24 | ImportFromSamePackage | 동일 패키지에 있을 경우 import문 필요X |
| 25 | SystemPrintln | System.out.print 사용 피하고 전용 logger 사용 |
| 26 | VariableNamingConventions | final 이 아닌 변수는 밑줄 포함 X |
| 27 | MisleadingVariableName | 변수명에 잘못된 prefix 사용-> non-field 이름이 m_으로 시작 X |
| 28 | AvoidArrayLoops | loop문 이용한 배열복사 대신 System.arraycopy() 메소드 이용 |
| 29 | UnnecessaryWrapperObjectCreation | 탐지된 코드 삭제 후 별도의 parse관련 전용 메소드 사용을 권장 |
| 30 | AvoidThrowingRawExceptionTypes | 가공되지 않은 Exception은 throw 비추천 |
| 31 | AvoidThrowingNullPointerException | throw 비추천 |
| 32 | StringInstantiation | 불필요한 String Instance 코드 삭제 후 간단한 형태의 코드로 변경 |
| 33 | StringToString | 불필요한 toString() 메소드 코드 제거 |
| 34 | InefficientStringBuffering | StringBuffer 함수내에서 비문자열 연산 이용하여 직접 결합하는 코드 사용 탐지, append 메소드 사용 권장 |
| 35 | InefficientEmptyStringCheck | whitespace/Non-whitespace확인을 위한 별도의 로직 구현 권장 |
| 36 | UselessStringValueOf | String을 append 할 경우, String.valueOf 함수 필요X |
| 37 | UnusedPrivateField | 사용되지 않는 Private field 탐지 ->해당 소스 확인 후 삭제 |
| 38 | UnusedPrivateMethod | 사용되지 않는 Private Method 선언 탐지 ->해당 소스 확인 후 삭제 |
| 39 | UnusedFormalParameter | 메소드 선언 내에 사용되지 않는 parameter 탐지 ->해당 소스 확인 후 삭제 |
PMD를 적용하여 소스 코드의 취약점을 파악


PMD를 실행하기 위해서는 Tools-Run PMD-pre Defined-ALL 을 선택하면 취약점을 알려주는 실행창이 뜸

SystemPrintln이라고 떴는데 이 경우에는 System.out.println의 사용을 피하고 전용 logger를 권장한다는 문구가 뜬 것임.
다양한 분석 도구 중 내가 맡았던 것이 PMD였는데 다른 팀원분들의 조사 결과 SonarQube를 중점적으로 찾아보는 것으로 결론남.