TIL-Sparrow 정적코드 분석 써본후기

kyoungyeon·2024년 11월 25일
0

TIL

목록 보기
123/125

상황

  • clean code, 코드 취약점을 분석해주는 sparrow solution을 사용해보았다

  • 엄청난 취약점이 발견되었다 backend에서..

  • try- catch를 잘 안썼거나, contextmanager 데코레이터로 db.session을 사전에 부모 모듈에서 설정해놓고 안 써서 중복 코드로 취약점히 잡힘

  • 그 외에도 .sh 등 shell 파일을 직접 프로덕션 환경 등에서 쓰면 취약점으로 인해 함수 변조등 해킹 가능성이 높다고 팀장님이 말해주심
    아니 그걸 왜 이제 말해줌..?

  • 그 외에

#  Exception: 모든 내장 예외의 기본 클래스
except Exception as e:
    print(e)

위 방식으로 에러 핸들링을 처리했는데 이 코드 또한 취약점 발생이 다수 발견하는 것을 목격함

교훈

  • case별로 Exception을 써야한다는 교훈을 얻었다
    • 근데 JAVA의 경우 NullPoint / EOF 등 여러 내장 예외 클래스가 있던데
      Python은 그런게 있는건가?

있음

  • JAVA 와 비교

|Java || Python|


NullPointerException TypeError/AttributeError
ArrayIndexOutOfBoundsException IndexError
IllegalArgumentException ValueError
NoSuchElementException KeyError
FileNotFoundException FileNotFoundError
IOException IOError
ClassNotFoundException ImportError

기본 예외들: (내장 예외 클래스)

TypeError: 타입 불일치
ValueError: 부적절한 값
IndexError: 리스트 인덱스 범위 초과
KeyError: 딕셔너리 키가 없음
IOError: 입출력 작업 실패시
FileNotFoundError: 파일 없음
ZeroDivisionError: 0으로 나누기
AttributeError: 존재하지 않는 속성 접근
ImportError: 모듈 임포트 실패
NameError: 정의되지 않은 변수 사용

특수 예외들:

StopIteration: 이터레이터 종료
AssertionError: assert 문 실패
RuntimeError: 일반적인 런타임 에러
PermissionError: 권한 관련 에러
TimeoutError: 시간 초과
ConnectionError: 네트워크 연결 관련 에러

class DataValidationError(Exception):
""" 데이터 검증 예외처리 후 """
pass

def demonstrate_common_exceptions():
    # 1. TypeError - 타입 불일치
    try:
        result = "123" + 456
    except TypeError as e:
        print(f"TypeError 발생: {e}")  # can only concatenate str (not "int") to str
        
    # 2. ValueError - 부적절한 값
    try:
        number = int("abc")
    except ValueError as e:
        print(f"ValueError 발생: {e}")  # invalid literal for int() with base 10: 'abc'
        
    # 3. IndexError - 리스트 인덱스 범위 초과
    try:
        my_list = [1, 2, 3]
        value = my_list[10]
    except IndexError as e:
        print(f"IndexError 발생: {e}")  # list index out of range
        
    # 4. KeyError - 딕셔너리 키가 없음
    try:
        my_dict = {"name": "John"}
        value = my_dict["age"]
    except KeyError as e:
        print(f"KeyError 발생: {e}")  # 'age'
        
    # 5. FileNotFoundError - 파일 없음
    try:
        with open("존재하지_않는_파일.txt", "r") as f:
            content = f.read()
    except FileNotFoundError as e:
        print(f"FileNotFoundError 발생: {e}")  # [Errno 2] No such file or directory
        
    # 6. ZeroDivisionError - 0으로 나누기
    try:
        result = 10 / 0
    except ZeroDivisionError as e:
        print(f"ZeroDivisionError 발생: {e}")  # division by zero

그외

  • logging? 데코레이션을 활용해서 일관된 error 패턴 처리
    • 상세 에러 메시지를 노출시키지 말아야함
- Validation Error
  • 이런 취약점 분석 솔루션도 언젠가 만들고 싶다!
profile
🏠TECH & GOSSIP

0개의 댓글