에이전트 룰 지연 로딩과 커널 드라이버 블루스크린 수정, 원격제어 실행 파일 mbedTLS 전환으로 59% 축소 — 주간 리뷰 (2026-10-12)

룰을 처음 쓸 때 읽도록 바꾼 에이전트 시작 구조, GetPUID·DriverEntry 할당 실패 블루스크린 수정, OpenSSL에서 mbedTLS로 바꿔 7.77MB를 3.14MB로 줄인 원격제어 바이너리, CPU 속도 제한·배터리 노후 하드웨어 증상 탐지, 윈도우 이벤트 룰 실측 교정을 다룬 Orange Labs 주간 개발 기록

이번 주에는 에이전트가 룰 파일을 시작할 때 모두 읽지 않고 처음 참조할 때 읽도록 시작 구조를 플러그인 단위로 나눴고, orange.sys 커널 드라이버에서 버퍼 할당 실패 때 나던 블루스크린 두 경로를 고쳤다. 원격제어 실행 파일은 크립토를 OpenSSL에서 mbedTLS로 바꿔 크기를 절반 아래로 줄였고, CPU 속도 제한·배터리 노후·그래픽 드라이버 없음을 잡는 하드웨어 증상 탐지가 올라왔다. 매니저에서는 현황 패널의 CPU·메모리 평균 계산 오류를 바로잡았다.

룰·데이터 분석 파트

윈도우 이벤트 룰을 고객사 실측으로 바로잡고 이벤트 98·149·1001·6008·34를 더했다(RULE 115). 룰 업로드가 거부된 사유를 매니저에 그대로 보여주고, 업로드용 ZIP을 만드는 스크립트를 두어 패키지가 산출물 넷을 검증해 담게 했다.

매니저 현황 패널의 CPU·메모리 평균이 PC 수로 두 번 나뉘어 작게 나오던 것(count 이중 나눗셈)을 고치고, 오늘 고점을 순간 최고 대신 칸 평균 최고로, 프로세스 탭 CPU 순위를 부하지수 합 기준으로 바꿨다. 노드 목록에서 PC명을 누르면 노드 상세가 열리게 했다. 서버 모니터링에서는 한 고객사의 중복 노드와 블루스크린 정리를 매시간 자동으로 돌게 했다.

커널 드라이버 파트

한 고객사 방문 수집 건을 현장에서 처리해 완료했다. 이번 주 커밋 산출물은 없다.

orange

매니저 관련 이슈를 완료했다. 이번 주 커밋 산출물은 없다.

분석 서비스 파트

rest-api의 ERROR 로그를 UTC 일자별 파일로 남기도록 하고, 로그 디렉터리를 마운트해 설치 제거 때 함께 지워지게 했다. nginx에서 파일함 원본 경로로의 직접 접근을 막았다.

서버 백엔드 파트

노드를 지울 때 그 노드가 올린 파일을 함께 지우도록 삭제 경로를 바꾸고, 증상 삭제도 같은 경로를 타게 했다. CUID 증상 삭제가 500으로 실패하던 것도 고쳤다. 고객사 데이터를 분석하려고 MongoDB 컬렉션을 뽑아 복원하는 스크립트를 만들고 1·2차 코드 리뷰 25건을 반영했다.

패키징에서는 uninstall 스크립트가 purge 실패를 숨기고 설정·데이터를 지우던 것과, update 스크립트가 서비스 기동 실패 때 서비스가 내려간 채 끝나던 것을 고쳤다. 인증서 발급 스크립트가 실패해도 키와 인증서 짝이 맞지 않는 상태로 정상 종료하던 것도 수정했다. pymongo를 4.18.3으로 올려 연결 문자열 호스트 주입 등 CVE 5건에 대응했다. rest-api·service의 개발 문서를 현재 코드에 맞게 대량 정정했다.

매니저·에이전트 파트

에이전트와 Agent UI가 주고받는 메시지 키를 에이전트 원래 이름·camelCase·{data, count} 구조로 통일했다. 목록은 어느 깊이에서든 {data, count}로 맞추고, 설정 선택지 원소를 {value, name} 객체로, 권장값을 recommendValue로 분리했다. get.LOAD 응답의 Memory가 늘 0이던 결함과, 빈 묶음에 "data": null을 만들던 결함도 함께 고쳤다.

룰 파일을 시작할 때 모두 읽지 않고 처음 참조할 때 읽도록 바꾸고, 룰 받기를 별도 플러그인으로 떼어 에이전트 시작을 플러그인 생명주기에 맞춰 나눴다. RULE의 파일 목록에 type·event·id 색인을 넣어 조회를 빠르게 했다(RULE 108·109). 탐지가 증적을 넘기면 매니페스트와 조각 단위로 이어서 올리는 레포트 전송 플러그인을 3단계로 완성하고, 대기함을 요약 DB 표로 옮겨 증상별·전체 상한을 두고 서버에 접속되지 않으면 압축하지 않고 미루게 했다.

서비스를 멈춘 원인을 드라이버 캐시가 아니라 OS 프로세스 스냅샷에서 찾도록 바꿔, sc stop이나 OS 종료·재부팅(PRESHUTDOWN)에서도 어떤 제어와 프로세스 사슬이 멈췄는지를 저장소·서버 로그·에이전트 표에 남긴다. orange.sys 커널 드라이버에서는 GetPUID와 DriverEntry가 버퍼 할당에 실패했을 때 NULL 읽기·0바이트 할당으로 블루스크린이 나던 것을 고치고, 모듈 버전을 빌드가 일치하는 출처에서만 읽게 했다(0.3.1.47~50).

CPU 속도 제한·배터리 노후·그래픽 드라이버 없음을 잡는 하드웨어 증상 탐지를 넣고 하드웨어 룰 넷을 더했다(RULE 111·112·113). 크래시 룰에 「호출자 있음」 하위 규칙과 RelatedProcess 증적을 더해 원인 칸에 호출자 이름·버전을 싣게 하고(RULE 105·106), 블루스크린 CUID를 분석기 값으로 갈라 세분화했다(RULE 114). 원격제어 실행 파일은 크립토를 OpenSSL에서 mbedTLS로 바꿔 크기를 7.77MB에서 3.14MB로 줄이고, DTLS 역할을 클라이언트로 돌려 브라우저의 조각난 ClientHello를 피했다.

개발 통계

  • 라인 수는 실소스 기준이며, 매니저·에이전트 파트는 바이너리 39파일·생성물 588파일을 제외한 값이다.
  • 커널 드라이버 파트와 프론트엔드 파트는 이번 주 커밋 없이 현장 대응·이슈 완료로 진행했다.