Pdf.js: ν…μŠ€νŠΈ λ ˆμ΄μ–΄ μŠ€νƒ€μΌ λ―Έμ„Έ μ΅œμ ν™”λ‘œ 인해 μ½˜ν…μΈ  λ³΄μ•ˆ 정책에 style-src 'unsafe-inline'이 ν•„μš”ν•¨

에 λ§Œλ“  2017λ…„ 02μ›” 13일  Β·  11μ½”λ©˜νŠΈ  Β·  좜처: mozilla/pdf.js

https://github.com/mozilla/pdf.js/commit/cb5f9df0c8932fe0db9f783ede7893b7efcadcdb λŠ” ν‘œμ€€ μ½˜ν…μΈ  λ³΄μ•ˆ μ •μ±…μ—μ„œ κΈˆμ§€ν•˜λŠ” μŠ€νƒ€μΌ λ¬Έμžμ—΄μ„ μžλ™μœΌλ‘œ μƒμ„±ν•˜κΈ° μ‹œμž‘ν–ˆμŠ΅λ‹ˆλ‹€. λŒ€μ•ˆμ΄ μžˆκ±°λ‚˜ μ ‘κ·Ό 방식을 μž¬κ³ ν•˜λŠ” 것이 쒋을 κ²ƒμž…λ‹ˆλ‹€.

μž¬ν˜„ν•˜λ €λ©΄ CSPμ—μ„œ style-src 'self' λ₯Ό μ‚¬μš©ν•˜μ‹­μ‹œμ˜€.

    <meta http-equiv="Content-Security-Policy" content="style-src 'self'" />
2-performance 4-text-selection

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

λ‹€λ₯Έ μ‚¬λžŒμ΄ 이 문제λ₯Ό μ ‘ν•˜κ³  μ†”λ£¨μ…˜μ„ μ›ν•˜λŠ” 경우λ₯Ό λŒ€λΉ„ν•˜μ—¬ ν˜„μž¬ 패치λ₯Ό 이전 λ°©μ‹μœΌλ‘œ λ‘€λ°±ν•˜μ—¬ style-src: 'unsafe-inline' λ₯Ό ν”Όν•  수 μžˆμŠ΅λ‹ˆλ‹€.

https://github.com/GrapheneOS/pdf.js/commit/021d2fddb03883054ef4399d1d3df87e0c6ab9ca

ν™•μ‹€νžˆ μ•½κ°„ μ΅œμ ν™”λ  수 μžˆμ§€λ§Œ λ‚΄ μ‚¬μš©μ— μ€‘μš”ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— μœ μ§€ κ΄€λ¦¬μ˜ μš©μ΄μ„±μ„ μœ„ν•΄ κ°€λŠ₯ν•œ ν•œ μ΅œμ†Œν•œμ˜ 패치λ₯Ό μœ μ§€ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. 이 λ³΄μ•ˆ 문제λ₯Ό ν•΄κ²°ν•˜μ—¬ μ„±λŠ₯ μ΅œμ ν™”μ— 관심을 κ°–κΈ°λ₯Ό λ°”λΌλŠ” μ‚¬λžŒμ€ μ•½κ°„ 후진적이라고 μƒκ°ν•©λ‹ˆλ‹€. μ„±λŠ₯ μ΅œμ ν™”λŠ” κΈ°λ³Έ λ³΄μ•ˆ μœ„μƒμ„ μœ„λ°˜ν•˜μ§€ μ•Šκ³  μˆ˜ν–‰ν•  수 μžˆλŠ” μž‘μ—…μœΌλ‘œ μ œν•œλ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€. μœ„μ—μ„œ μ–ΈκΈ‰ν•œ κ²ƒμ²˜λŸΌ λ‹€λ₯Έ λ°©μ‹μœΌλ‘œ μ ‘κ·Όν•˜λŠ” 것이 더 λΉ λ₯Ό μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. μ΅œμ ν™”λ₯Ό μœ„ν•œ 컀밋 λ©”μ‹œμ§€μ—λŠ” 차이λ₯Ό μΈ‘μ •ν•˜λŠ” 것쑰차 μ–Όλ§ˆλ‚˜ μ–΄λ €μš΄μ§€ μ–ΈκΈ‰λ˜μ–΄ μžˆμ§€λ§Œ λ³΄μ•ˆ νšŒκ·€λŠ” 맀우 μ‰½κ²Œ μΈ‘μ •λ©λ‹ˆλ‹€.

μ œκ°€ pdf.jsλ₯Ό μ‚¬μš©ν•˜λŠ” μ΄μœ λŠ” μ• μ΄ˆμ— λ³΄μ•ˆ λ•Œλ¬Έμž…λ‹ˆλ‹€. λ©”λͺ¨λ¦¬ μ•ˆμ „ μ–Έμ–΄(JavaScript)μ—μ„œ λͺ¨λ“  PDF κ΄€λ ¨ λ Œλ”λ§κ³Ό ν•¨κ»˜ κ°•ν™”/μƒŒλ“œλ°•μŠ€ λΈŒλΌμš°μ € λ Œλ”λ§μ„ μž¬μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이 μž‘μ—…μ˜ μΌλΆ€λ‘œ CSPλ₯Ό μ‚¬μš©ν•˜μ—¬ 곡격 ν‘œλ©΄μ„ μ›Ή νŽ˜μ΄μ§€μ™€ 같이 크게 μ¦κ°€μ‹œν‚¬ 수 μžˆλŠ” 동적 μ½”λ“œ/μŠ€νƒ€μΌ μ£Όμž…μ„ μ™„ν™”ν•©λ‹ˆλ‹€. μ΄λŠ” λͺ©ν‘œμ— 맀우 λ°˜λŒ€μž…λ‹ˆλ‹€. λ‹€λ₯Έ λ§Žμ€ μ‚¬λžŒλ“€μ΄ μœ„ν—˜ν•œ κΈ°λ³Έ PDF λ Œλ”λ§ 라이브러리λ₯Ό ν”Όν•˜κΈ° μœ„ν•΄ pdf.js에 λŒ€ν•œ μœ μ‚¬ν•œ μ‚¬μš© 사둀λ₯Ό 가지고 μžˆλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. unsafe-inline μŠ€νƒ€μΌμ„ ν”Όν•˜λŠ” 것은 버그가 μ‹€μˆ˜λ‘œ μž„μ˜μ˜ μŠ€νƒ€μΌμ„ μ£Όμž…ν•˜μ—¬ λ§Žμ€ λ Œλ”λŸ¬ 곡격 ν‘œλ©΄μ„ μ—΄μ–΄μ£ΌλŠ” κ²°κ³Όλ₯Ό μ΄ˆλž˜ν•˜μ§€ μ•Šλ„λ‘ ν•˜λŠ” μΌλΆ€μž…λ‹ˆλ‹€. μ‹€μ œ μ›Ή μ‚¬μ΄νŠΈμ— ν¬ν•¨λœ μ‚¬μš© μ‚¬λ‘€μ˜ 경우 CSS둜 λ§Žμ€ λ‚˜μœ 일을 ν•  수 있기 λ•Œλ¬Έμ— 훨씬 더 μ€‘μš”ν•©λ‹ˆλ‹€.

λ„€μ΄ν‹°λΈŒ λ°”μ΄λ„ˆλ¦¬/λΌμ΄λΈŒλŸ¬λ¦¬μ— SSP, ASLR(PIE), _FORTIFY_SOURCE=2 , -fstack-clash-protection 및 기타 κΈ°λ³Έ μ™„ν™” κΈ°λŠ₯이 μžˆμ„ κ²ƒμœΌλ‘œ μ˜ˆμƒν•˜λŠ” 것과 λ™μΌν•œ μˆ˜μ€€μ—μ„œ 이λ₯Ό κ³ λ €ν•©λ‹ˆλ‹€. κΈ°λ³Έ λ³΄μ•ˆ μœ„μƒ λŒ€ μœ ν˜• 기반 CFI, μ •μˆ˜ μƒˆλ‹ˆνƒ€μ΄μ € νŠΈλž˜ν•‘, ShadowCallStack λ“±κ³Ό 같은 κ³ κΈ‰ κΈ°λŠ₯μž…λ‹ˆλ‹€. 더 큰 ν”„λ‘œμ νŠΈμ—μ„œ 이에 λŒ€ν•΄ μƒκ°ν•˜κ³  이미 μž‘μ—… 쀑일 κ²ƒμœΌλ‘œ μ˜ˆμƒν•˜μ§€λ§Œ μ΅œμ†Œν•œμ˜ 뢀뢄은 μ•„λ‹™λ‹ˆλ‹€. 정적 JavaScript/CSSλ₯Ό μ‚¬μš©ν•œ κΈ°λ³Έ CSP 정책은 λ‚΄ 생각에 κΈ°λ³Έ λ³΄μ•ˆ μœ„μƒμ— ν•΄λ‹Ήν•©λ‹ˆλ‹€.

λͺ¨λ“  11 λŒ“κΈ€

... λ˜λŠ” μ ‘κ·Ό 방식을 μž¬κ³ ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

PR #7632λŠ” 특히 이슈 #7584의 일뢀인 enhanceTextSelection λͺ¨λ“œμ˜ μ„±λŠ₯을 ν–₯μƒμ‹œν‚€κΈ° μœ„ν•΄ ν•„μš”ν–ˆμŠ΅λ‹ˆλ‹€. κ·Έλž˜μ„œ 제 μƒκ°μ—λŠ” 이것을 λ˜λŒλ¦¬λŠ” 것도 κ³ λ €λ˜μ–΄μ•Ό ν•œλ‹€κ³  μƒκ°ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

λ‚˜λŠ” 그것을 μ΅œμ ν™”ν•˜κΈ° μœ„ν•΄ λ‹€λ₯Έ 경둜λ₯Ό 택할 것을 μ œμ•ˆν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, 4개의 νŒ¨λ”© 속성을 μ‚¬μš©ν•œ λ‹€μŒ λ³‘ν•©ν•˜λŠ” λŒ€μ‹  style 둜 μ μš©ν•˜λŠ” μ΄μœ λŠ” λ¬΄μ—‡μž…λ‹ˆκΉŒ?

style λ₯Ό 톡해 λͺ¨λ“  μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ” λŒ€μ‹  κ°œλ³„ μŠ€νƒ€μΌ 속성을 μ„€μ •ν•˜κΈ° μœ„ν•΄ 정적 λ°°μ—΄ μ ‘κ·Ό 방식을 계속 μ‚¬μš©ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. font-family 및 font-size 속성은 padding 처럼 병합될 수 μžˆμŠ΅λ‹ˆλ‹€.

λ‚˜λŠ” 그것을 μ΅œμ ν™”ν•˜κΈ° μœ„ν•΄ λ‹€λ₯Έ 경둜λ₯Ό 택할 것을 μ œμ•ˆν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, 4개의 νŒ¨λ”© 속성을 μ‚¬μš©ν•œ λ‹€μŒ λ³‘ν•©ν•˜λŠ” λŒ€μ‹  μŠ€νƒ€μΌλ‘œ μ μš©ν•˜λŠ” μ΄μœ λŠ” λ¬΄μ—‡μž…λ‹ˆκΉŒ?

일반적으둜 νŠΉμ • textDiv 에 enhanceTextSelection μ—…λ°μ΄νŠΈλœ 4개의 νŒ¨λ”© 값이 λͺ¨λ‘ ν•„μš”ν•˜λ‹€λŠ” 보μž₯은 μ—†μœΌλ©° ν˜„μž¬ μ½”λ“œλŠ” κ·Έ (맀우 일반적인) 경우λ₯Ό μ²˜λ¦¬ν•˜λŠ” κ°„λ‹¨ν•œ 방법을 μ œκ³΅ν–ˆμŠ΅λ‹ˆλ‹€.

μŠ€νƒ€μΌμ„ 톡해 λͺ¨λ“  μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ” λŒ€μ‹  κ°œλ³„ μŠ€νƒ€μΌ 속성을 μ„€μ •ν•˜κΈ° μœ„ν•΄ μ—¬μ „νžˆ 정적 λ°°μ—΄ μ ‘κ·Ό 방식을 μ‚¬μš©ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

style μ‚¬μš©ν•˜μ—¬ λͺ¨λ“  것을 ν•œ λ²ˆμ— μ—…λ°μ΄νŠΈν•˜λŠ” 일반적인 μ΄μœ λŠ” textDiv 생성/μ—…λ°μ΄νŠΈν•  λ•Œ DOM을 λΆˆν•„μš”ν•˜κ²Œ λ¬΄νš¨ν™”ν•˜λŠ” 것을 λ°©μ§€ν•˜κΈ° μœ„ν•œ κ²ƒμž…λ‹ˆλ‹€. enhanceTextSelection λͺ¨λ“œμ˜ μ„±λŠ₯이 쒋지 μ•ŠμŠ΅λ‹ˆλ‹€.

일반적으둜 νŠΉμ • textDivκ°€ EnhancedTextSelection으둜 μ—…λ°μ΄νŠΈλœ 4개의 νŒ¨λ”© 값을 λͺ¨λ‘ ν•„μš”λ‘œ ν•œλ‹€λŠ” 보μž₯은 μ—†μœΌλ©° ν˜„μž¬ μ½”λ“œλŠ” κ·Έ (맀우 일반적인) 경우λ₯Ό μ²˜λ¦¬ν•˜λŠ” κ°„λ‹¨ν•œ 방법을 μ œκ³΅ν–ˆμŠ΅λ‹ˆλ‹€.

κ·Έλ ‡λ‹€κ³  padding λ₯Ό 효율적으둜 μ‚¬μš©ν•  수 μ—†λ‹€λŠ” μ˜λ―ΈλŠ” μ•„λ‹™λ‹ˆλ‹€. μ—…λ°μ΄νŠΈν•˜μ§€ μ•ŠλŠ” 뢀뢄에 λŒ€ν•΄ μƒˆ λ¬Έμžμ—΄μ„ μž‘μ„±ν•  ν•„μš”κ°€ μ—†μœΌλ©° μ΅œμ’… κ²°κ³ΌλŠ” 더 μž‘μ•„μ§‘λ‹ˆλ‹€. 단일 style 속성 μ„ΈνŠΈλ₯Ό 단일 style.padding μ„ΈνŠΈλ‘œ λŒ€μ²΄ν•  수 있으며 " 0 "을 μž¬μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μŠ€νƒ€μΌμ„ μ‚¬μš©ν•˜μ—¬ ν•œ λ²ˆμ— λͺ¨λ“  것을 μ—…λ°μ΄νŠΈν•˜λŠ” 일반적인 μ΄μœ λŠ” textDivsλ₯Ό 생성/μ—…λ°μ΄νŠΈν•  λ•Œ DOM을 λΆˆν•„μš”ν•˜κ²Œ λ¬΄νš¨ν™”ν•˜μ§€ μ•ŠμœΌλ €κ³  ν•˜λŠ” κ²ƒμ΄μ—ˆμŠ΅λ‹ˆλ‹€. μ™œλƒν•˜λ©΄ 이것이 ν–₯μƒν…μŠ€νŠΈ 선택 λͺ¨λ“œμ˜ λ‚˜μœ μ„±λŠ₯에 λŒ€ν•œ μ£Όμš” κΈ°μ—¬μž 쀑 ν•˜λ‚˜μΈ 것 κ°™μ•˜κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.

μ‹€μ œ DOM이 μ•„λ‹Œ ν”„λž˜κ·Έλ¨ΌνŠΈμ—μ„œ λ°œμƒν•˜μ§€ μ•ŠμŠ΅λ‹ˆκΉŒ?

νŒ¨λ”©μ„ 효율적으둜 μ‚¬μš©ν•  수 μ—†λ‹€λŠ” μ˜λ―ΈλŠ” μ•„λ‹™λ‹ˆλ‹€.

@thestinger λŠ” 일뢀 μ„±λŠ₯ 데이터가 ν¬ν•¨λœ 벀치마크λ₯Ό μ‚¬μš©ν•  수 μžˆλŠ” 경우 문제λ₯Ό ν•΄κ²°ν•˜λŠ” 데 도움이 될 κ²ƒμ΄λΌλŠ” 데 λ™μ˜ν•©λ‹ˆλ‹€.

μ—¬κΈ°μ—μ„œ μ„œλ‘œ λ‹€λ₯Έ μ ‘κ·Ό 방식 κ°„μ˜ 차이λ₯Ό μΈ‘μ •ν•  수 μ—†μŠ΅λ‹ˆλ‹€. λ‹€λ₯Έ μ ‘κ·Ό 방식은 μ»¨ν…μŠ€νŠΈμ—μ„œ 마이크둜 λ²€μΉ˜λ§ˆν‚Ήλ  수 μžˆμŠ΅λ‹ˆλ‹€.

unsafe-inline 과의 μΆ©λŒμ€ 이λ₯Ό μ‘°μ •ν•˜μ—¬ μ„±λŠ₯ 손싀 없이 쀄일 수 있으며 μœ μ§€κ°€ μ€‘μš”ν•œ 경우 μ΅œμ ν™”λ₯Ό μ‘°κ±΄λΆ€λ‘œ λ§Œλ“€ 수 μžˆλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.

이 컀밋을 되돌리기 쉽기 λ•Œλ¬Έμ— μš°μ„  μˆœμœ„κ°€ λ†’μ§€λŠ” μ•Šμ§€λ§Œ μž‘μ—…ν•  μ‚¬λžŒμ„ 찾으렀고 λ…Έλ ₯ν•  κ²ƒμž…λ‹ˆλ‹€. CSP ν•­λͺ©μ— λŒ€ν•œ ν…ŒμŠ€νŠΈλ₯Ό μˆ˜ν–‰ν•˜μ—¬ λ―Έλž˜μ— μ€‘λ‹¨λ˜μ§€ μ•Šλ„λ‘ ν•˜λŠ” 것이 쒋을 κ²ƒμž…λ‹ˆλ‹€(이와 같은 μ΅œμ ν™”λŠ” μ€‘μš”ν•œ 경우 계속 λ°œμƒν•  수 있으며 쑰건뢀일 ν•„μš”κ°€ 있음).

CSPλ₯Ό μ‚¬μš©ν•˜μ—¬ μ›Ή μ‚¬μ΄νŠΈλ₯Ό μ§€μ›ν•˜λ©΄μ„œ μ΅œμ ν™”λ₯Ό ν—ˆμš©ν•˜λŠ” μ†”λ£¨μ…˜μ΄ μžˆμ„ 수 μžˆμŠ΅λ‹ˆλ‹€.

인라인 μŠ€νƒ€μΌμ„ λ¬Έμžμ—΄λ‘œ μ„€μ •ν•˜λŠ” μ„Έ 가지 방법이 μžˆμŠ΅λ‹ˆλ‹€.

  • element.setAttribute('style', someStyle) , μ•ˆμ „ν•˜μ§€ μ•Šμ€ 인라인을 ν—ˆμš©ν•˜μ§€ μ•ŠλŠ” CSPκ°€ μžˆλŠ” 경우 μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
  • element.style = someStyle IEμ—μ„œ μ§€μ›λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€(IE 11μ—μ„œ ν…ŒμŠ€νŠΈ, Edgeμ—μ„œ ν…ŒμŠ€νŠΈν•˜μ§€ μ•Šμ•˜μœΌλ―€λ‘œ μ—¬κΈ°μ—μ„œλ„ 손상될 수 있음)
  • element.style.cssText = someStyle , DOM 레벨 2λΆ€ν„° μ§€μ›ν•˜λ―€λ‘œ IEμ—μ„œλ„ 지원(IE 11μ—μ„œ 확인)

μ„Έ 가지 방법을 λ³΄μ—¬μ£ΌλŠ” Plunker: https://plnkr.co/edit/T8xrUmR5eSuqDukSEVuw?p=preview

이 μ†”λ£¨μ…˜μ— λ™μ˜ν•œλ‹€λ©΄ element.setAttribute('style', ...) 을 element.style.cssText = ... λ³€κ²½ν•˜λŠ” ν’€ λ¦¬ν€˜μŠ€νŠΈλ₯Ό ν•˜κ³  μ‹ΆμŠ΅λ‹ˆλ‹€.

element.style.cssText = someStyle 이 unsafe-eval 없이 μž‘λ™ν•˜λ©΄ λΈŒλΌμš°μ € λ²„κ·Έμ²˜λŸΌ λ³΄μž…λ‹ˆλ‹€.

λ‹€λ₯Έ μ‚¬λžŒμ΄ 이 문제λ₯Ό μ ‘ν•˜κ³  μ†”λ£¨μ…˜μ„ μ›ν•˜λŠ” 경우λ₯Ό λŒ€λΉ„ν•˜μ—¬ ν˜„μž¬ 패치λ₯Ό 이전 λ°©μ‹μœΌλ‘œ λ‘€λ°±ν•˜μ—¬ style-src: 'unsafe-inline' λ₯Ό ν”Όν•  수 μžˆμŠ΅λ‹ˆλ‹€.

https://github.com/GrapheneOS/pdf.js/commit/021d2fddb03883054ef4399d1d3df87e0c6ab9ca

ν™•μ‹€νžˆ μ•½κ°„ μ΅œμ ν™”λ  수 μžˆμ§€λ§Œ λ‚΄ μ‚¬μš©μ— μ€‘μš”ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— μœ μ§€ κ΄€λ¦¬μ˜ μš©μ΄μ„±μ„ μœ„ν•΄ κ°€λŠ₯ν•œ ν•œ μ΅œμ†Œν•œμ˜ 패치λ₯Ό μœ μ§€ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. 이 λ³΄μ•ˆ 문제λ₯Ό ν•΄κ²°ν•˜μ—¬ μ„±λŠ₯ μ΅œμ ν™”μ— 관심을 κ°–κΈ°λ₯Ό λ°”λΌλŠ” μ‚¬λžŒμ€ μ•½κ°„ 후진적이라고 μƒκ°ν•©λ‹ˆλ‹€. μ„±λŠ₯ μ΅œμ ν™”λŠ” κΈ°λ³Έ λ³΄μ•ˆ μœ„μƒμ„ μœ„λ°˜ν•˜μ§€ μ•Šκ³  μˆ˜ν–‰ν•  수 μžˆλŠ” μž‘μ—…μœΌλ‘œ μ œν•œλ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€. μœ„μ—μ„œ μ–ΈκΈ‰ν•œ κ²ƒμ²˜λŸΌ λ‹€λ₯Έ λ°©μ‹μœΌλ‘œ μ ‘κ·Όν•˜λŠ” 것이 더 λΉ λ₯Ό μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. μ΅œμ ν™”λ₯Ό μœ„ν•œ 컀밋 λ©”μ‹œμ§€μ—λŠ” 차이λ₯Ό μΈ‘μ •ν•˜λŠ” 것쑰차 μ–Όλ§ˆλ‚˜ μ–΄λ €μš΄μ§€ μ–ΈκΈ‰λ˜μ–΄ μžˆμ§€λ§Œ λ³΄μ•ˆ νšŒκ·€λŠ” 맀우 μ‰½κ²Œ μΈ‘μ •λ©λ‹ˆλ‹€.

μ œκ°€ pdf.jsλ₯Ό μ‚¬μš©ν•˜λŠ” μ΄μœ λŠ” μ• μ΄ˆμ— λ³΄μ•ˆ λ•Œλ¬Έμž…λ‹ˆλ‹€. λ©”λͺ¨λ¦¬ μ•ˆμ „ μ–Έμ–΄(JavaScript)μ—μ„œ λͺ¨λ“  PDF κ΄€λ ¨ λ Œλ”λ§κ³Ό ν•¨κ»˜ κ°•ν™”/μƒŒλ“œλ°•μŠ€ λΈŒλΌμš°μ € λ Œλ”λ§μ„ μž¬μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이 μž‘μ—…μ˜ μΌλΆ€λ‘œ CSPλ₯Ό μ‚¬μš©ν•˜μ—¬ 곡격 ν‘œλ©΄μ„ μ›Ή νŽ˜μ΄μ§€μ™€ 같이 크게 μ¦κ°€μ‹œν‚¬ 수 μžˆλŠ” 동적 μ½”λ“œ/μŠ€νƒ€μΌ μ£Όμž…μ„ μ™„ν™”ν•©λ‹ˆλ‹€. μ΄λŠ” λͺ©ν‘œμ— 맀우 λ°˜λŒ€μž…λ‹ˆλ‹€. λ‹€λ₯Έ λ§Žμ€ μ‚¬λžŒλ“€μ΄ μœ„ν—˜ν•œ κΈ°λ³Έ PDF λ Œλ”λ§ 라이브러리λ₯Ό ν”Όν•˜κΈ° μœ„ν•΄ pdf.js에 λŒ€ν•œ μœ μ‚¬ν•œ μ‚¬μš© 사둀λ₯Ό 가지고 μžˆλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. unsafe-inline μŠ€νƒ€μΌμ„ ν”Όν•˜λŠ” 것은 버그가 μ‹€μˆ˜λ‘œ μž„μ˜μ˜ μŠ€νƒ€μΌμ„ μ£Όμž…ν•˜μ—¬ λ§Žμ€ λ Œλ”λŸ¬ 곡격 ν‘œλ©΄μ„ μ—΄μ–΄μ£ΌλŠ” κ²°κ³Όλ₯Ό μ΄ˆλž˜ν•˜μ§€ μ•Šλ„λ‘ ν•˜λŠ” μΌλΆ€μž…λ‹ˆλ‹€. μ‹€μ œ μ›Ή μ‚¬μ΄νŠΈμ— ν¬ν•¨λœ μ‚¬μš© μ‚¬λ‘€μ˜ 경우 CSS둜 λ§Žμ€ λ‚˜μœ 일을 ν•  수 있기 λ•Œλ¬Έμ— 훨씬 더 μ€‘μš”ν•©λ‹ˆλ‹€.

λ„€μ΄ν‹°λΈŒ λ°”μ΄λ„ˆλ¦¬/λΌμ΄λΈŒλŸ¬λ¦¬μ— SSP, ASLR(PIE), _FORTIFY_SOURCE=2 , -fstack-clash-protection 및 기타 κΈ°λ³Έ μ™„ν™” κΈ°λŠ₯이 μžˆμ„ κ²ƒμœΌλ‘œ μ˜ˆμƒν•˜λŠ” 것과 λ™μΌν•œ μˆ˜μ€€μ—μ„œ 이λ₯Ό κ³ λ €ν•©λ‹ˆλ‹€. κΈ°λ³Έ λ³΄μ•ˆ μœ„μƒ λŒ€ μœ ν˜• 기반 CFI, μ •μˆ˜ μƒˆλ‹ˆνƒ€μ΄μ € νŠΈλž˜ν•‘, ShadowCallStack λ“±κ³Ό 같은 κ³ κΈ‰ κΈ°λŠ₯μž…λ‹ˆλ‹€. 더 큰 ν”„λ‘œμ νŠΈμ—μ„œ 이에 λŒ€ν•΄ μƒκ°ν•˜κ³  이미 μž‘μ—… 쀑일 κ²ƒμœΌλ‘œ μ˜ˆμƒν•˜μ§€λ§Œ μ΅œμ†Œν•œμ˜ 뢀뢄은 μ•„λ‹™λ‹ˆλ‹€. 정적 JavaScript/CSSλ₯Ό μ‚¬μš©ν•œ κΈ°λ³Έ CSP 정책은 λ‚΄ 생각에 κΈ°λ³Έ λ³΄μ•ˆ μœ„μƒμ— ν•΄λ‹Ήν•©λ‹ˆλ‹€.

μœ„μ˜ pull μš”μ²­μ— μ˜ν•΄ μˆ˜μ •λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰