https://github.com/mozilla/pdf.js/commit/cb5f9df0c8932fe0db9f783ede7893b7efcadcdb λ νμ€ μ½ν μΈ λ³΄μ μ μ± μμ κΈμ§νλ μ€νμΌ λ¬Έμμ΄μ μλμΌλ‘ μμ±νκΈ° μμνμ΅λλ€. λμμ΄ μκ±°λ μ κ·Ό λ°©μμ μ¬κ³ νλ κ²μ΄ μ’μ κ²μ λλ€.
μ¬ννλ €λ©΄ CSPμμ style-src 'self'
λ₯Ό μ¬μ©νμμμ€.
<meta http-equiv="Content-Security-Policy" content="style-src 'self'" />
... λλ μ κ·Ό λ°©μμ μ¬κ³ ν μλ μμ΅λλ€.
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 μμ²μ μν΄ μμ λμμ΅λλ€.
κ°μ₯ μ μ©ν λκΈ
λ€λ₯Έ μ¬λμ΄ μ΄ λ¬Έμ λ₯Ό μ νκ³ μ루μ μ μνλ κ²½μ°λ₯Ό λλΉνμ¬ νμ¬ ν¨μΉλ₯Ό μ΄μ λ°©μμΌλ‘ λ‘€λ°±νμ¬
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 μ μ± μ λ΄ μκ°μ κΈ°λ³Έ 보μ μμμ ν΄λΉν©λλ€.