동작을 위한 의존성 분석
Offering: GitLab.com, GitLab Self-Managed, GitLab Dedicated
Libbehave는 머지 리퀘스트 파이프라인 중에 의존성을 스캔하여 새로 추가된 라이브러리와 잠재적으로 위험한 동작을 식별하는 실험적 기능입니다. Libbehave에 의해 감지된 각 기능에는 다음 중 하나의 "위험도" 점수가 할당됩니다:
Libbehave는 머지 리퀘스트 파이프라인 중에 의존성을 스캔하여 새로 추가된 라이브러리와 잠재적으로 위험한 동작을 식별하는 실험적 기능입니다. 전통적인 의존성 스캔이 알려진 취약점을 찾는 반면, Libbehave는 의존성이 나타내는 기능과 동작에 대한 통찰력을 제공합니다.
Libbehave에 의해 감지된 각 기능에는 다음 중 하나의 "위험도" 점수가 할당됩니다:
- 정보: 위험 없음, 의존성의 기능을 분류하는 데 도움이 될 수 있습니다(예: JSON 사용).
- 낮음: 작은 위험, 의존성이 암호화 사용과 같이 보안에 민감한 작업을 수행한다는 것을 강조할 수 있습니다.
- 중간: 중간 수준의 위험, 민감한 데이터가 저장되거나 접근될 수 있는 파일 시스템과 상호 작용하거나 환경 변수를 읽는 데 사용될 수 있습니다.
- 높음: 가장 높은 수준의 위험, OS 명령 실행이나 코드를 동적으로 평가하는 등 보안 취약점에서 흔히 악용되는 동작입니다.
Libbehave가 감지하는 기능에는 다음이 포함됩니다:
- OS 명령 실행
- 동적 코드 실행(eval)
- 파일 읽기/쓰기
- 네트워크 소켓 열기
- 아카이브 읽기/확장(ZIP/tar/Gzip)
- HTTP 클라이언트, Redis, Elastic Cache, 관계형 관리 데이터베이스(RMDB) 서버, SSH, Git을 사용하여 외부 서비스와 상호 작용
- 다양한 형식으로 데이터 직렬화: XML, YAML, MessagePack, Protocol Buffers, JSON 및 언어별 형식
- 템플릿
- 인기 프레임워크
- 파일 업로드/다운로드
지원되는 각 패키지 관리자 유형에 대한 Libbehave 데모는 Libbehave 데모 프로젝트를 참조하세요.
지원되는 언어 및 패키지 관리자#
Libbehave에서 지원하는 언어 및 패키지 관리자는 다음과 같습니다:
- C# (NuGet)
Directory.Build.props파일 읽기(발견된 경우 속성 값 대체)*.deps.json파일 읽기**/*.dll및**/*.exe파일 읽기
- Go
go.mod파일 읽기
- Java (Maven)
pom.xml파일 읽기(발견된 경우 속성 값 대체)**/gradle.lockfile*파일 읽기
- JavaScript/TypeScript (npmjs)
**/package-lock.json파일 읽기**/yarn.lock파일 읽기**/pnpm-lock.yaml파일 읽기
- Python (pypi)
**/*requirements*.txt파일 읽기**/poetry.lock파일 읽기**/Pipfile.lock파일 읽기**/setup.py파일 읽기- egg 또는 wheel 설치 디렉토리의 패키지 읽기:
**/*dist-info/METADATA,**/*egg-info/PKG-INFO,**/*DIST-INFO/METADATA및**/*EGG-INFO/PKG-INFO파일 읽기
- PHP (Composer/Packagist)
**/installed.json파일 읽기**/composer.lock파일 읽기**/php/.registry/.channel.*/*.reg"파일 읽기
- Ruby (RubyGems)
**/Gemfile.lock파일 읽기**/specifications/**/*.gemspec파일 읽기**/*.gemspec파일 읽기
이전 파일은 소스 브랜치에서 파일이 수정된 경우에만 새 의존성을 분석합니다.
Libbehave 활성화#
사전 요구사항:
- 프로젝트의 Developer, Maintainer 또는 Owner 역할.
- 파이프라인이 정의된 소스 및 대상 Git 브랜치가 있는 활성 머지 리퀘스트 파이프라인의 일부입니다.
- 프로젝트에 지원되는 언어 중 하나가 포함되어 있습니다.
- 프로젝트가 소스 또는 기능 브랜치에 새 의존성을 추가하고 있습니다.
Libbehave를 활성화하려면:
-
상단 표시줄에서 검색 또는 이동을 선택하고 프로젝트를 찾습니다.
-
왼쪽 사이드바에서 코드 > 저장소를 선택합니다.
-
.gitlab-ci.yml파일을 선택합니다. -
편집 > 단일 파일 편집을 선택합니다.
-
Libbehave CI/CD 구성요소를 추가합니다:
include: - component: $CI_SERVER_FQDN/security-products/experiments/libbehave/libbehave@v0.1.0 inputs: stage: test -
변경 사항 커밋을 선택합니다.
이 구성은 테스트 스테이지에 libbehave-experiment라는 새 작업을 만듭니다.
머지 리퀘스트 댓글 구성#
Libbehave에 대한 머지 리퀘스트 댓글을 구성하려면 프로젝트 액세스 토큰을 구성합니다.
사전 요구사항:
- 프로젝트의 Maintainer 또는 Owner 역할.
- 프로젝트에 대해 Libbehave가 활성화되어 있습니다.
머지 리퀘스트 댓글을 구성하려면:
-
상단 표시줄에서 검색 또는 이동을 선택하고 프로젝트를 찾습니다.
-
왼쪽 사이드바에서 설정 > 액세스 토큰을 선택합니다.
-
새 토큰 추가를 선택하고 필드를 완성합니다:
- 토큰 이름: 예를 들어
libbehave-bot과 같은 이름을 입력합니다. - 역할: Guest를 선택합니다.
- 범위 선택: API 체크박스를 선택합니다.
- 토큰 이름: 예를 들어
-
프로젝트 액세스 토큰 생성을 선택합니다.
프로젝트 액세스 토큰을 클립보드에 복사합니다. 다음 단계에서 필요합니다.
-
설정 > CI/CD를 선택합니다.
-
변수를 확장합니다.
-
변수 추가를 선택하고 필드를 완성합니다:
- 키:
BEHAVE_TOKEN을 입력합니다. - 값: 프로젝트 액세스 토큰을 붙여넣습니다.
- 가시성: 마스킹됨을 선택합니다.
- 플래그: 변수 보호 체크박스를 선택 해제합니다.
- 키:
-
변수 추가를 선택합니다.
CI/CD 구성요소는 자동으로 BEHAVE_TOKEN을 사용하므로 구성요소 입력에 지정할 필요가 없습니다.
머지 리퀘스트 댓글은 소스 브랜치가 보호된 브랜치이거나 BEHAVE_TOKEN 변수에 대해 변수 보호 옵션이 선택 해제된 경우에만 나타납니다.
사용 가능한 CI/CD 입력 및 변수#
CI/CD 변수를 사용하여 Libbehave의 CI 구성요소를 사용자 정의할 수 있습니다.
다음 변수는 Libbehave가 실행되는 방식의 동작을 구성합니다.
| CI/CD 변수 | CLI 인수 | 기본값 | 설명 |
|---|---|---|---|
CI_MERGE_REQUEST_SOURCE_BRANCH_NAME |
-source |
"" |
비교할 소스 브랜치(예: feature-branch) |
CI_MERGE_REQUEST_TARGET_BRANCH_NAME |
-target |
"" |
비교할 대상 브랜치(예: main) |
BEHAVE_TIMEOUT |
-timeout |
"30m" |
패키지 분석 및 다운로드에 허용되는 최대 시간(예: 30m) |
BEHAVE_TOKEN |
-token |
"" |
선택 사항. 액세스 토큰(머지 리퀘스트 댓글 생성에 필요) |
CI_PROJECT_ID |
-project |
"" |
선택 사항. 결과가 포함된 머지 리퀘스트 노트를 생성하는 프로젝트 ID |
CI_MERGE_REQUEST_IID |
-mrid |
"" |
선택 사항. 결과가 포함된 머지 리퀘스트 노트를 생성하는 머지 리퀘스트 ID |
다음 플래그는 사용 가능하지만 테스트되지 않았으며 기본값으로 유지해야 합니다:
| CI/CD 변수 | CLI 인수 | 기본값 | 설명 |
|---|---|---|---|
BEHAVE_RULE_PATHS |
-rules |
"/dist" |
규칙 파일의 경로. |
BEHAVE_TARGET_DIR |
-dir |
"" |
behave를 실행할 대상 디렉토리. |
BEHAVE_NO_GIT_IGNORE |
-no-git-ignore |
true |
.gitignore에 있는 파일을 스캔할지 여부. 인수를 제공하면 스캔하지 않으며, 기본적으로 스캔합니다. |
BEHAVE_OUTPUT_PATH |
-output |
"behaveout" |
스캔 결과, 추출된 아티팩트 및 보고서 결과를 저장하는 경로. |
BEHAVE_INCLUDE_LANG |
-include-lang |
"" |
언어 포함, 다음 중 하나: csharp, go, java, js, php, python 또는 ruby, ','로 구분하여 지정되지 않은 모든 다른 언어 제외. |
BEHAVE_EXCLUDE_LANG |
-exclude-lang |
"" |
언어 제외, 다음 중 하나: csharp, go, java, js, php, python 또는 ruby, ','로 구분하여 지정되지 않은 모든 다른 언어 포함. |
BEHAVE_EXCLUDE_FILES |
-exclude- |
"" |
정규 표현식으로 파일이나 경로 제외, 개별 정규 표현식은 ','로 구분. |
모든 변수가 테스트되지 않았으므로 작동하는 것도 있고 작동하지 않는 것도 있을 수 있습니다. 작동하지 않는 것이 필요한 경우 기능 요청을 제출하거나 코드에 기여하여 사용할 수 있도록 하세요.
의존성 감지 및 분석#
Libbehave는 새로 추가된 의존성에 대한 발견 사항을 분석하고 보고하며 머지 리퀘스트 파이프라인에서 실행되도록 설계되었습니다. 즉, 머지 리퀘스트에 새 의존성이 포함되어 있지 않으면 Libbehave는 결과를 반환하지 않습니다.
감지는 사용되는 언어와 패키지 관리자에 따라 다르게 작동합니다. 기본적으로 지원되는 패키지 관리자의 패키지 관리자 관련 파일이 파싱되어 추가되는 의존성을 식별합니다. 이 정보가 수집된 다음 각 패키지 관리자 API를 호출하여 식별된 패키지의 아티팩트를 다운로드하는 데 사용됩니다.
다운로드 후 의존성이 추출되고 구성된 검사 세트를 가진 Semgrep 기반 정적 분석 방법을 사용하여 분석됩니다.
Java와 C#의 경우 정적 분석을 실행하기 전에 바이너리 아티팩트를 디컴파일하는 추가 단계가 수행됩니다.
알려진 문제#
각 언어에는 고유한 알려진 문제가 있습니다.
Gemfile.lock 및 requirements.txt와 같은 모든 패키지 파일은 명시적인 버전을 제공해야 합니다.
버전 범위는 지원되지 않습니다.
C##
.props또는.csproj파일의 속성 또는 변수 대체는 중첩된 프로젝트 파일을 고려하지 않습니다. 추출된 변수의 글로벌 세트와 해당 값과 일치하는 모든 변수를 대체합니다.- 다운로드된 의존성을 디컴파일하므로 소스에서 줄로의 변환이 1:1이 아닐 수 있습니다.
- Libbehave는 NuGet 패키지에 있는 모든 .NET 버전을 디컴파일합니다. 이는 미래에 최적화될 수 있습니다.
- 예를 들어 일부 의존성은 단일 아카이브에 여러 프레임워크 버전을 대상으로 하는 여러 DLL을 패키징합니다(예: net20/Some.dll, net45/Some.dll).
Java#
pom.xml파일의 상속을 지원하지 않습니다.- Maven만 지원하며 사용자 정의 JFrog 또는 기타 아티팩트 저장소는 지원하지 않습니다.
- 다운로드된 의존성을 디컴파일하므로 소스에서 줄로의 변환이 1:1이 아닐 수 있습니다.
Python#
- 분석을 위해 PyPI에서 소스 패키지를 다운로드하려고 시도합니다. 소스 패키지가 없는 경우
Libbehave는 대상 OS와 일치하지 않을 수 있는 첫 번째 사용 가능한
bdist_wheel패키지를 다운로드합니다.
출력#
Libbehave는 다음 출력을 생성합니다:
- 작업 요약: 발견 사항의 요약이 의존성이 감지한 기능에 대한 빠른 보기를 위해 CI/CD 출력 작업 콘솔에 직접 출력됩니다.
- MR 댓글 요약: 발견 사항의 요약이 더 쉬운 검토를 위해 머지 리퀘스트 댓글 노트로 출력됩니다. 이는 작업이 MR 노트 섹션에 쓸 수 있는 액세스 토큰이 구성되어 있어야 합니다.
- HTML 아티팩트: 라이브러리의 검색 가능한 세트와 식별된 기능 및 발견을 트리거한 정확한 코드 줄이 포함된 HTML 아티팩트.
작업 요약#
작업 요약은 추가 구성이 필요하지 않으며 성공적인 분석 후 항상 표시됩니다.
작업 요약 출력의 예시:
# Job output #
[=== libbehave: New packages detected ===]
🔺 4 new packages have been detected in this MR.
[= java - open-vulnerability-clients 6.1.7 =]
The https://mvnrepository.com/artifact/io.github.jeremylong/open-vulnerability-clients package was found to exhibit the following behaviors:
- 🟧 GzipReadArchive (Risk: Medium)
-----------------
[= java - jdiagnostics 1.0.7 =]
The https://mvnrepository.com/artifact/org.anarres.jdiagnostics/jdiagnostics package was found to exhibit the following behaviors:
- 🟥 CryptoMD5 (Risk: High)
- 🟧 WriteFile (Risk: Medium)
- 🟧 ReadFile (Risk: Medium)
- 🟧 ReadEnvVars (Risk: Medium)
-----------------
[= java - commons-dbcp2 2.12.0 =]
The https://mvnrepository.com/artifact/org.apache.commons/commons-dbcp2 package was found to exhibit the following behaviors:
- 🟥 JavaObjectSerialization (Risk: High)
- 🟧 Passwords (Risk: Medium)
-----------------
[= java - jmockit 1.49 =]
The https://mvnrepository.com/artifact/org.jmockit/jmockit package was found to exhibit the following behaviors:
- 🟥 JavaObjectSerialization (Risk: High)
- 🟧 WriteFile (Risk: Medium)
- 🟧 ReadFile (Risk: Medium)
- 🟨 CryptoRAND (Risk: Low)
-----------------
MR 댓글 요약#
MR 댓글 요약 출력에는 Libbehave 구성요소가 구성된 프로젝트에 대해 Guest 수준 액세스 권한이 있는 액세스 토큰이 생성되어야 합니다. 그런 다음 액세스 토큰은 프로젝트에 대해 구성되어야 합니다. 기능 브랜치는 기본적으로 보호되지 않으므로 변수 보호 설정이 선택 해제되어 있는지 확인합니다. 그렇지 않으면 Libbehave 작업이 액세스 토큰 값을 읽을 수 없습니다.

HTML 아티팩트#
HTML 아티팩트는 작업 아티팩트 출력(behaveout/gl-libbehave.html)에 나타나며 작업 아티팩트 다운로드에서 액세스할 수 있어야 합니다.

오프라인 환경(지원되지 않음)#
Libbehave는 다양한 패키지 관리자에서 직접 의존성을 가져오기 때문에 오프라인 환경에서 작동하지 않습니다.
문제 해결#
작업이 실행되지 않음#
Libbehave 작업이 실행되지 않는 경우 프로젝트가 머지 리퀘스트 파이프라인을 실행하도록 구성되어 있는지 확인합니다.
머지 리퀘스트 댓글이 추가되지 않음#
이는 일반적으로 BEHAVE_TOKEN이 설정되지 않은 경우에 발생합니다. 액세스 토큰에 Guest 수준 액세스 권한이 있고 설정 > CI/CD 변수 설정에서 변수 보호 옵션이 선택 해제되어 있는지 확인합니다.
오류: {401 Permission Denied}#
이는 일반적으로 BEHAVE_TOKEN에 올바른 값이 포함되지 않은 경우에 발생합니다. 액세스 토큰에 Guest 수준 액세스 권한이 있는지 확인합니다.
