← 스터디 홈
2편 · 약 14분

OS 패키지 vs 라이브러리 취약점

두 가지 종류의 소프트웨어

리눅스 서버나 컨테이너 이미지를 스캔하면 취약점이 두 개의 층에서 나온다. 첫 번째 층은 OS 패키지다. 운영체제 패키지 관리자(apt, yum/dnf, apk 등)가 설치한 바이너리와 공유 라이브러리들이 여기 속한다. 두 번째 층은 언어 라이브러리다. npm, PyPI, Maven, crates.io처럼 언어별 패키지 레지스트리에서 설치한 의존성들이다.

취약점 수집과 매칭 관점에서 이 두 층은 전혀 다른 방식으로 동작한다. 생태계가 다르고, 버전 형식이 다르고, 보안 패치 배포 방식도 다르다.

OS 패키지 생태계

Debian / Ubuntu — .deb

dpkgapt로 관리한다. 패키지 버전 형식은 다음과 같다.

[epoch:]upstream_version[-debian_revision]

예: 1:9.10.3.dfsg.P4-12.3+deb9u4

  • 1: → epoch. 이전 버전 체계를 교체할 때 올린다.
  • 9.10.3.dfsg.P4 → 업스트림 버전. dfsg는 Debian Free Software Guidelines에 맞게 재패키징했다는 표시.
  • 12.3+deb9u4 → Debian 리비전. deb9u4는 Debian 9(stretch)의 네 번째 보안 업데이트라는 의미.

보안 권고는 DSA(Debian Security Advisory)로 발행된다. Ubuntu는 USN(Ubuntu Security Notice)을 사용하며, 각 LTS 버전별로 별도 취약점 DB를 관리한다.

Red Hat / CentOS / Fedora — .rpm

rpmyum/dnf로 관리한다. 패키지를 완전히 식별하려면 NEVRA(Name, Epoch, Version, Release, Architecture) 다섯 필드가 필요하다.

예: openssl-1.0.1e-58.el6_10.x86_64

  • 1.0.1e → 업스트림 버전
  • 58.el6_10 → 릴리즈 번호. el6_10은 RHEL 6.10용 빌드라는 뜻.

보안 권고는 RHSA(Red Hat Security Advisory)로 발행된다. OVAL(Open Vulnerability and Assessment Language) 정의가 공개되어 스캐너들이 이를 참조한다.

Alpine Linux — APK

컨테이너 이미지의 베이스로 자주 쓰인다. 버전 형식은 업스트림 버전 뒤에 _rN(패키지 리비전)을 붙이는 경우가 많다.

예: openssl-3.1.4-r2.apk

Alpine은 자체 ALAS(Alpine Linux Advisory) 시스템을 운영하며, 보안 패치는 주로 해당 브랜치에서 빠르게 업스트림 버전으로 업그레이드하는 방식으로 이루어진다.

Debian / Ubuntu apt / dpkg .deb · epoch:up-rev DSA / USN
RHEL / CentOS yum / dnf .rpm · NEVRA RHSA / OVAL
Alpine apk .apk · up_rN Alpine Security
OS 패키지 생태계 — 관리자·버전형식·보안권고 비교

언어 라이브러리 생태계

OS 패키지와 달리 언어 라이브러리는 대부분 원본 업스트림 버전을 그대로 사용하고, 각 언어 커뮤니티가 직접 레지스트리와 취약점 DB를 관리한다.

생태계레지스트리버전 형식OSV 접두사
Node.jsnpmjs.comSemVer 2.0GHSA, CVE
PythonPyPIPEP 440PYSEC, GHSA
JavaMaven Centralmajor.minor.patch[-qualifier]GHSA, CVE
Rustcrates.ioSemVer 2.0RUSTSEC
Goproxy.golang.orgSemVer 2.0GO-YYYY-…
RubyRubyGemsmajor.minor.patchGHSA

언어 라이브러리 취약점은 대개 GitHub Security Advisory(GHSA) 또는 해당 언어 커뮤니티 DB에 먼저 등록되고, 이후 NVD/CVE로 연결된다.

컨테이너 이미지의 두 레이어

컨테이너 이미지를 스캔하면 두 층이 동시에 드러난다.

언어 레이어 (앱 의존성)
package.json / requirements.txt / pom.xml npm · PyPI · Maven · crates.io · Go OSV ECOSYSTEM range / SemVer 비교
OS 레이어 (베이스 이미지)
dpkg · rpm · apk 데이터베이스 libc · openssl · curl · bash … DSA / RHSA / OVAL / ALAS 참조
컨테이너 이미지의 취약점 두 레이어

Trivy는 이 두 레이어를 모두 인식하며, 컨테이너 이미지의 각 레이어를 분해해 OS 패키지와 언어 라이브러리 취약점을 구분해 보고한다. Grype는 Syft로 생성한 SBOM(Software Bill of Materials)을 입력으로 받아 더 세밀한 의존성 분석을 수행한다.

백포팅 — 가장 큰 함정

백포팅이란

엔터프라이즈 배포판(RHEL, Debian stable, Ubuntu LTS 등)은 소프트웨어를 최신 버전으로 업그레이드하는 대신 보안 패치만 이전 버전에 역이식(backport)하는 전략을 쓴다. 이유는 하위 호환성과 안정성이다. 운영 환경에서 메이저 버전이 바뀌면 예측하기 어려운 부작용이 생길 수 있다.

결과적으로 버전 번호는 취약한 것처럼 보이지만 실제로는 패치가 적용된 상태가 된다.

예: OpenSSL on RHEL 6

NVD 기준으로 OpenSSL 1.0.1e는 수십 개의 CVE에 노출되어 있다. 그러나 RHEL 6 패키지 openssl-1.0.1e-58.el6_10에서 릴리즈 번호 58은 업스트림 1.0.1e 출시 이후 Red Hat이 적용한 패치 수를 반영한다. 실제로 이 패키지는 1.0.1e 명칭을 유지하면서도 RHSA로 발표된 보안 수정을 모두 포함한다.

단순히 버전 문자열만 비교하는 스캐너는 이 패키지를 오탐(false positive)으로 보고한다. 올바른 스캐너는 배포판 자체의 취약점 DB(RHSA OVAL, DSA, USN 등)를 참조해 해당 릴리즈 번호 이상이면 수정된 것으로 판단한다.

백포팅이 없는 생태계

언어 라이브러리 생태계는 일반적으로 백포팅을 하지 않는다. PyPI에서 requests 2.28.0이 취약하면, 해결책은 2.28.2(새 버전)으로 업그레이드하는 것이다. 버전 번호에 숨겨진 패치가 없으므로 버전 비교만으로 취약 여부를 판단할 수 있다.

OS 패키지
(RHEL/Ubuntu)
버전 문자열만으로
판단 불가
배포판 보안 DB
(RHSA / DSA / USN)
참조 필요
언어 라이브러리
(npm / PyPI)
버전 비교로
직접 판단 가능
OSV fixed 버전과
installed 버전 비교
백포팅 여부에 따른 취약점 판단 흐름

OSV에서의 표현 차이

OSV 레코드에서 OS 패키지와 언어 라이브러리는 ecosystem 필드로 구분된다.

// OS 패키지 예 (Ubuntu)
{
  "package": {
    "ecosystem": "Ubuntu:22.04:LTS",
    "name": "openssl"
  },
  "ranges": [
    {
      "type": "ECOSYSTEM",
      "events": [
        { "introduced": "0" },
        { "fixed": "3.0.2-0ubuntu1.12" }
      ]
    }
  ]
}
// 언어 라이브러리 예 (PyPI)
{
  "package": {
    "ecosystem": "PyPI",
    "name": "requests",
    "purl": "pkg:pypi/requests"
  },
  "ranges": [
    {
      "type": "SEMVER",
      "events": [
        { "introduced": "2.0.0" },
        { "fixed": "2.28.2" }
      ]
    }
  ]
}

OS 패키지는 ECOSYSTEM 타입을 쓰고, 언어 라이브러리는 SemVer를 따르는 경우 SEMVER 타입을 쓸 수 있다. ECOSYSTEM 타입은 버전 비교를 생태계 고유 로직에 의존하므로, OSV 권고 사항에 따라 versions[] 배열도 함께 제공하는 것이 좋다.

실무 요점 정리

항목OS 패키지언어 라이브러리
버전 비교배포판 DB 우선 참조직접 버전 비교 가능
백포팅흔함 (특히 LTS/RHEL)거의 없음
OSV typeECOSYSTEMSEMVER 또는 ECOSYSTEM
취약점 DBDSA / RHSA / USN / ALASGHSA / PYSEC / RUSTSEC 등
스캐너 접근OVAL/Advisory 교차 참조버전 범위 직접 비교
오탐 위험백포팅으로 높음낮음

Open Questions

  • Alpine은 백포팅 정책이 업스트림과 다소 달라 브랜치별로 확인 필요.
  • RHEL 9+ (Rocky Linux, AlmaLinux 포함) OVAL 정의 취득 경로가 변경될 수 있음.

References

  • https://www.debian.org/doc/debian-policy/ch-binary.html
  • https://manpages.ubuntu.com/manpages/xenial/man5/deb-version.5.html
  • https://access.redhat.com/solutions/57665
  • https://access.redhat.com/articles/red_hat_vulnerability_tutorial
  • https://support.pagely.com/hc/en-us/articles/360020671131-Vulnerability-Scanners-returning-false-positives-due-to-backporting
  • https://github.com/google/osv-scanner
  • https://github.com/anchore/grype
  • https://ossf.github.io/osv-schema/