Study

pugjs 취약점

cloudnaaam 2025. 6. 26. 14:59

- 이 글은 아직 현업을 경험하지 못한 보안 공부생의 정리 글이니, 정확하지 않을 수도 있습니다.-

 

워게임 풀다가 관련 개념이 나와서 간단히 정리해 보려 한다.

 

pug는 html을 더 효과적으로 보여주는 렌더링 엔진이다. pretty option을 통해 입력 값을 들여쓰기 해서 보여줄 수 있는데, 여기서 RCE가 발생할 수 있다고 한다.

 

 visitMixin: function(mixin) { 
   var name = 'pug_mixins['; 
   var args = mixin.args || ''; 
   var block = mixin.block; 
   var attrs = mixin.attrs; 
   var attrsBlocks = this.attributeBlocks(mixin.attributeBlocks); 
   var pp = this.pp; 
   var dynamic = mixin.name[0] === '#'; 
   var key = mixin.name; 
   if (dynamic) this.dynamicMixins = true; 
   name += 
     (dynamic 
       ? mixin.name.substr(2, mixin.name.length - 3) 
       : '"' + mixin.name + '"') + ']'; 
  
   this.mixins[key] = this.mixins[key] || {used: false, instances: []}; 
   if (mixin.call) { 
     this.mixins[key].used = true; 
     if (pp) 
       this.buf.push( 
         "pug_indent.push('" + Array(this.indents + 1).join(pp) + "');" 
       );

 

내부 코드를 보면 pp에 pretty의 입력값을 넣게 된다.

마지막 부분을 보면 버퍼에 push 하는 부분이 있는데, 문법에 맞춰서

')console.log('hello');// 를 넣으면

 if (pp) 
   this.buf.push( 
     "pug_indent.push('')console.log('hello');//');" 
   );

이렇게 넣을 수 있다.

이후 버퍼에 흘러들어간 코드가 내부 로직을 통해 실행된다는 것 같다.

 

3.0.0 이후 버전부터는 조치되었다고 하니, 알아만 놓자.

Reference

https://github.com/pugjs/pug/issues/3312

https://www.piolink.com/kr/service/Security-Analysis.php?bbsCode=security&vType=view&idx=67&page=4

'Study' 카테고리의 다른 글

JWT (Json web token)  (0) 2025.08.20
Web cache deception  (0) 2025.07.19
Unicode case mapping collision  (0) 2025.06.26
Prototype Pollution  (0) 2025.06.25
CSP  (1) 2025.06.24