문제 상황
이번에 회사 프로젝트가 출시 준비에 들어가면서 개발 중인 코드를 다른 회사에 정적 분석을 맡기게 되었습니다. 그래서 이번 기회에 정적 분석이 무엇인지, 왜 해야하는지 조사하였습니다.
정적 분석 정의
정적 분석은 소프트웨어 개발 과정에서 소스 코드, 바이너리 코드 또는 애플리케이션을 실행하지 않고 검사하는 기술입니다. 이 분석을 통해 코드에서 안티 패턴, 코딩 오류, 보안 취약점, 스타일 문제 등을 발견할 수 있습니다. 정적 분석 도구는 코드를 논리적으로 분석하고 복잡한 알고리즘을 사용하여 잠재적인 문제점을 식별합니다.
정적 분석 필요성
- 품질 향상: 개발 초기 단계에서 코드의 버그와 취약점을 식별하여 수정함으로써 소프트웨어의 전반적인 품질을 향상 시킬 수 있습니다. 이는 추후 발생할 수 있는 오류를 미연에 방지하고, 유지 보수 비용을 줄이는 데 도움을 줍니다.
- 보안 강화: 보안 취약점을 조기에 발견하고 해결함으로써 소프트웨어의 보안 수준을 강화할 수 있습니다. 이는 특히 금융, 의료, 국방 등 보안이 중요한 분야에서 더욱 중요합니다.
- 표준 준수: 코딩 표준과 컨벤션을 준수함으로써 개발자 간의 코드 이해도를 높이고 협업을 촉진할 수 있습니다. 또한, 특정 산업 표준이나 규제 요구사항을 충족시키기 위해 정적 분석이 필요할 수 있습니다.
- 개발 효율성 증가: 초기에 문제를 발견하고 수정함으로써 개발 과정에서의 지연을 줄이고, 제품 출시 시간을 단축할 수 있습니다.
사용중인 정적 분석 도구 : ktlint
저희는 현재 ktlint를 사용하고 있습니다. ktlint 도 Kotlin 프로그래밍 언어를 위한 정적 코드 분석 도구입니다. 이 툴은 Kotlin 코드의 스타일과 포맷팅을 체크하여, 코드의 일관성과 가독성을 향상시키는 데 도움을 줍니다. ktlint는 Kotlin 공식 코딩 스타일 가이드를 기반으로 작동하지만, 사용자 정의 규칙을 추가하여 특정 프로젝트나 팀의 요구사항에 맞춰 조정할 수도 있습니다.
주요 특징
- 스타일 체크: Kotlin의 공식 코딩 스타일을 따르도록 코드를 분석하고, 일관되지 않은 스타일 사용을 지적합니다.
- 자동 수정: ktlint -F 명령어를 사용하면, 대부분의 스타일 이슈를 자동으로 수정할 수 있습니다. 이는 개발자가 수동으로 코드 스타일 문제를 수정하는 시간을 절약할 수 있게 해줍니다.
- 플러그인 지원: IntelliJ IDEA와 같은 IDE나, Gradle, Maven과 같은 빌드 도구에 플러그인 형태로 통합할 수 있어, 개발 과정에서 실시간으로 코드 스타일을 검토하고 수정할 수 있습니다.
- 사용자 정의 규칙: 기본 제공되는 규칙 외에도, 팀의 특정 코딩 규칙을 정의하여 적용할 수 있습니다. 이를 통해 팀 내 코드 스타일의 일관성을 유지할 수 있습니다.
이번에 맞긴 정적 분석 : 스패로우
이번에 스패로우에 코드를 보내서 받은 정적 분석 리포트가 387 페이지였습니다. 초기 정적 분석은 단순히 단어와 문법만 확인했기 때문에 지금보다 오탐지의 확률이 높았다고 한다. 현재는 개선된 버전이라고 하는데, 이번에 정적 분석 리포트에서 hilt에 대한 코드들이 다 매우 위험으로 감지되었다. 해당 라이브러리는 Android Developers에서 추천하는 것이라서 당황스러웠다. 해당 부분이 1000개 정도 감지된 위험 요소의 80% 정도를 차지하고 있었는데, 실제로 보안 위험이 있는지는 좀 더 조사해봐야할 것 같다. 하지만 종종 오탐지가 보인다. 따라서 무조건 신뢰하기 보다는 참고 용도로 사용하는 것이 좋을 것 같다.
참고 링크
https://sparrow.im/kr/product/sast/
https://developer.android.com/training/dependency-injection/hilt-android?hl=ko