Spring Boot + Gradle + Gitlab과 함께 정적 코드 분석 도구인 Spotbugs 사용

Spring Boot + Gradle + Gitlab과 함께 정적 코드 분석 도구인 Spotbugs 사용

내용은 Spotbugs 4.7.3 기준으로 작성되었으며, Spotbugs Gradle 플러그인 5.0.14 사용되었습니다.

정적 코드 분석 도구란 무엇입니까?

정적 분석 도구 코드를 검사하여 메모리 누수 또는 버퍼 오버플로와 같은 일반적인 버그 및 취약성을 식별하고 코딩 표준을 적용할 수 있습니다. 다시 말해서, 코드의 정확도, 스타일, 성능 등 코드 품질에 관련된 패턴을 분석해서 알려준다. 또한 GNU 약소 일반 공중 사용 허가서 조건하에 배포되는 자유 소프트웨어입니다. 도구 중 콘텐츠는 Intellij에서도 사용할 수 있습니다. Spotbugs 치료할 것이다

정적 및 동적 분석

코드 분석이 반드시 정적 분석일 필요는 없습니다. 동적인 분석도 있고 그 목적은 취약점을 찾는 것과 같습니다. 차이점은 개발 주기의 어느 지점에서 분석이 수행되는지, 동적 분석은 애플리케이션 테스팅 및 수행 단계에서 취약점을 발견하다 정적 분석은 실행 시점 이전에 수행되므로 개발 초기부터 사용할 수 있다.

반점 벌레는 무엇입니까

스팟 버그 Java 바이트 코드를 분석하여 오류 패턴을 찾는 오픈 소스 정적 분석 소프트웨어입니다. (위에서 언급한 GNU LGPL 라이선스 적용)
원래 존재하던 정적 분석 도구 Findbugs 2006년 미국 메릴랜드 대학에서 개발한 성공적인 프로젝트로 Java 프로그램에서 발생할 수 있는 100여 가지의 잠재적 오류를 분류 및 탐지하고 그 결과를 XML로 저장하도록 지원합니다. 또한 사용자 지정을 통해 규칙 집합을 적용할 수 있습니다.

Spotbugs에서 제공하는 감지 유형(4.7.3부터)

  • 나쁜 습관: 다음과 같은 나쁜 개발자 습관을 식별합니다. B. 클래스 명명 규칙 및 null 값 처리 오류.
  • 정확성: 잘못된 상수 및 무의미한 메서드 호출과 같은 문제가 있는 코드를 감지합니다.
  • 실험적: 메서드에 의해 생성된 스트림 또는 리소스를 해제하지 못하는 코드를 감지합니다.
  • 국제화: 지역 특성을 고려하지 않은 코드 인식. B. 기본 인코딩이 지정되지 않은 경우
  • 악성 코드 취약성: 보안 코드에 취약한 가변 배열, 컬렉션 또는 해시 테이블을 탐지합니다.
  • 멀티스레딩 정확성: 멀티스레딩에 안전하지 않은 개체 사용과 같은 것을 감지합니다.
  • Fake Random Noise: 소프트웨어에서 실제 버그를 찾는 것이 아니라 데이터 마이닝 실험에서 컨트롤로 유용하도록 의도됨
  • 성능: 성능에 영향을 미치는 코드를 감지합니다. B. 사용되지 않는 필드 및 비효율적인 개체 생성
  • 보안: CSS, DB 비밀번호 누락 등 보안 취약 코드 탐지
  • Shady Code: 다음과 같은 가짜 또는 오류가 발생하기 쉬운 코드를 감지합니다. B. int 곱셈 결과를 long으로 변환

사용 목적

버그를 유발하거나 보안을 해치는 코드를 개발자마다 다른 코딩 방식으로 인해 방치하게 되면 프로그램의 고질적인 문제로 남거나 유지보수에 어려움을 겪는 상황이 발생합니다. 따라서 규칙에 따라 코드가 잘 작성되었는지 확인하고 수정해야 합니다. 그러나 사람이 매번 코드를 직접 검사하기는 어렵기 때문에 정적 코드 분석 도구를 사용한다. 유형에는 CheckStyle, PMD 및 SpotBugs(FindBugs를 연결하는 분석 도구)가 포함됩니다.

Spotbugs 선택해야 하는 이유 씌우다, 소나큐브 (예시: Spotbugs + SonarQube로 확인 후 SonarQube 대시보드에서 종합적으로 확인 가능) 새로운 패턴이 추가되면 다른 도구에서 쉽게 패턴을 적용하여 결과를 볼 수 있음

또한 다양한 빌드 도구(Maven, Gradle 등) 및 개발 도구(Intellij, Eclipse 등)와 쉽게 연동되며, 다양한 운영체제(Linux, Windows, macOSX)를 지원하고 JAR에서만 사용할 수 있도록 바이트코드를 분석한다. 소스코드가 없는 파일, 분석 가능

버그 장단점 발견

  • 실제 버그를 찾는 데 능숙함
  • 발견된 오류는 잘못된 오류일 가능성이 적습니다.
  • 바이트코드를 읽어서 속도가 빠르다(컴파일된 클래스 파일에서 바이트코드를 읽어서 사용하기 때문에 빌드 과정이 필수)

Spotbugs 실습(with. Spring Boot + Gradle)

지능

  1. 플러그인 설치
    • 설정.. > 플러그인 > SpotBugs 검색 및 설치

  2. 시험
    • 원하는 패키지를 마우스 오른쪽 버튼으로 클릭합니다. Analyze Package(S) Files 딸깍 하는 소리

빌드 단계에서 실패 가능성을 줄이기 위해 Intellij 플러그인을 통해 사전에 검증을 수행해야 합니다.

스프링 부트 + 그레이들

  1. 종속성 추가
    (빌드.그레이들)
    plugins {
        ...
        id "com.github.spotbugs" version "5.0.14"
    }
    
    ...
    
    // ---------------- Static Application Security Testing (SAST) Start
    // https://github.com/spotbugs/spotbugs-gradle-plugin/blob/master/README.md
    tasks.withType(com.github.spotbugs.snom.SpotBugsTask) {
       spotbugs {
          ignoreFailures = true   // 오류무시여부
          showStackTraces = true  // 스택트래이스 표시 여부
          showProgress = true  // 프로그레스바 표시 여부
       }
    
       reports {
          xml.required.set(false) // XML 파일 생성여부
          html {
             required = true
             outputLocation = file("src/main/resources/spotbugs.html")   // Report File 추출경로
          }
       }
    }
    // ---------------- Static Application Security Testing (SAST) End
    
    ...
    
    task buildStep {
       ...
       // SpringBoot Application 에서 화면을 표시하기위해 정적경로에 추출한 HTML 파일을 복사
       copy {
             from projectDir.toString() + "/src/main/resources/"
             include "spotbugs.html"
             into serverFolderResourcesDir + "static/"         
       }
    }
    
  2. 작동 테스트
    $ ./gradlew spotbugsMain
    
  3. 리소스/정적 경로에 spotbugs.html 파일이 생성된 것을 볼 수 있습니다.
  4. http://localhost:9090/spotbugs.html 확인

작업 순서

  1. Intellij Spotbugs 플러그인을 통해 코드 수정
  2. 리포팅 파일을 참조하여 코드 커버리지 확인(Spotbugs 보고서는 Spotbugs Ignore 설정을 사용하여 웹 페이지에서 실제 빌드 중에 주기적으로 확인할 수 있습니다. 실제 빌드 중 감사 추적은 build/reports/spotbugs/main .html이 추출됩니다. HTML 파일로 사용되지만 SonarQube에 연결되면 XML 파일로도 사용됩니다.)

참조

  • https://www.jetbrains.com/
  • https://engineering.linecorp.com/
  • https://keichee.
  • https://camelsource.
  • 오픈SW로 소프트웨어 개발 시 보안성 검토 가이드 일부 읽기
  • IGLOO_PLUS에 대한 일부 참조