ReleaseJob#unpack은 job_dir = File.join(@release_dir, 'jobs', name) 및 job_tgz = File.join(@release_dir, 'jobs', "#{name}.tgz") 여기서 name은 @job_meta['name']을 반환합니다. 이 값은 작업에서 그대로 가져온 값입니다. 업로드된 tarball 내부의 공격자가 제공한 release.MF 배열입니다. 그런 다음 이러한 경로는 셸 문자열로 보간됩니다: Bosh::Common::Exec.sh("tar -C #{job_dir} -xf #{job_tgz} 2>&1", :on_error => :return). Bosh::Common::Exec.sh는 %x{#{command}}(bosh-common/lib/bosh/common)를 통해 실행됩니다.
ReleaseJob#unpack은 job_dir = File.join(@release_dir, 'jobs', name) 및 job_tgz = File.join(@release_dir, 'jobs', "#{name}.tgz") 여기서 name은 @job_meta['name']을 반환합니다. 이 값은 작업에서 그대로 가져온 값입니다. 업로드된 tarball 내부의 공격자가 제공한 release.MF 배열입니다. 그런 다음 이러한 경로는 셸 문자열로 보간됩니다: Bosh::Common::Exec.sh("tar -C #{job_dir} -xf #{job_tgz} 2>&1", :on_error => :return). Bosh::Common::Exec.sh는 %x{#{command}}(bosh-common/lib/bosh/common/exec.rb:53), 즉 /bin/sh -c를 통해 실행되므로 이름의 모든 셸 메타 문자가 해석됩니다. 49행의 FileUtils.mkdir_p(job_dir)는 리터럴 디렉터리(셸 없음)를 만들고 이름에 $()/;가 포함되어 있어도 성공하므로 실행은 sh 호출에 도달합니다.
영향을 받는 버전:
왜 이 VPI인가 (설명가능 · 실험적)
VPI 산정 기준
| 영향도 | 87.00 |
| 악용 신호(추가 악용신호 없음) | ×1.00 |
| VPI | 87.00 |
VPI 공식 vpi-v1 기준
| 소스 | CVSS 버전 | 기본 점수 | 심각도 | 벡터 문자열 | 평가일 |
|---|---|---|---|---|---|
| NVDNIST | 4.0 | 8.7 | HIGH | CVSS:4.0/AV:L/AC:H/AT:P/PR:H/UI:N/VC:H/VI:H/VA:H/SC:H/SI:H/SA:H/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X | 2026. 06. 04. |
| NVDNIST | 3.1 |
| 8.2 |
HIGH |
| CVSS:3.1/AV:L/AC:L/PR:H/UI:N/S:C/C:H/I:H/A:H |
| 2026. 06. 04. |