ÇØÄ¿Áî´º½º / ÇØÄ¿´ëÇÐ

Donation bitcoin(±âºÎ¿ë ºñÆ®ÄÚÀÎ ÁÖ¼Ò)

¡¡
1Pq3K39XM5xx4CifGKgppXeavtWNNHH7K4
¡¡
±âºÎÇϽŠºñÆ®ÄÚÀÎÀº "º¸¾È Ãë¾à °èÃþ"À» À§ÇØ »ç¿ëµÇ°í ÀÖ½À´Ï´Ù.
¡¡
¡¡

Donation bitcoin(±âºÎ¿ë ºñÆ®ÄÚÀÎ ÁÖ¼Ò)

¡¡
1Pq3K39XM5xx4CifGKgppXeavtWNNHH7K4
¡¡
±âºÎÇϽŠºñÆ®ÄÚÀÎÀº "º¸¾È Ãë¾à °èÃþ"À» À§ÇØ »ç¿ëµÇ°í ÀÖ½À´Ï´Ù.
¡¡

°øÁö

¡¡

1. MS ¿§Áö ºê¶ó¿ìÀú¿¡¼­ÀÇ °æ°íâÀº 'À©µµ¿ì µðÆæ´õ'¸¦ ²ô½Ã¸é µË´Ï´Ù.

             'À©µµ¿ì µðÆæ´õ ²ô±â'

2. Å©·Ò ºê¶ó¿ìÀú·Î Á¢¼Ó½Ã ³ª¿À´Â ¾Ç¼ºÄÚµå °æ°íâÀº ±¸±Û Å©·ÒÀÇ ¿¡·¯, Áï ¿ÀŽ(ŽÁö ¿À·ù)À̹ǷΠ¹«½ÃÇÏ½Ã¸é µË´Ï´Ù.

3. ÀÌ »çÀÌÆ®´Â ¾ÈÀüÇÏ¸ç ±ú²ýÇÏ´Ù´Â °ÍÀ» ¾Ë·Á µå¸³´Ï´Ù.

4. ¹«°íÇÑ »çÀÌÆ®µé¿¡ ´ëÇÑ °ø·æ ±â¾÷ ºê¶ó¿ìÀúµéÀÇ ¹«Â÷º°ÀûÀÎ 'ŽÁö ¿À·ù ȾÆ÷'°¡ »ç¿ëÀÚµéÀÇ Á¤º¸ °øÀ¯ÀÇ ÀÚÀ¯¸¦ ħÇØÇÏ°í ÀÖ½À´Ï´Ù. ÀÌ¿¡ ´ëÀÀÇÏ¿© ÀÌ ±â¾÷µéÀ» »ó´ë·Î ¼Ò¼ÛÀ» ÁغñÇÏ°í ÀÖ½À´Ï´Ù.

¡¡





  ÇØÄ¿¸ô  
No, 3967
±¸ºÐ: Á¤º¸
Á¾·ù: ±âŸ
2022/3/7(¿ù)
Á¶È¸: 2188
Node.js¿¡¼­ÀÇ ÇÁ·ÎÅäŸÀÔ ¿À¿° °ø°ÝÀ̶õ ¹«¾ùÀΰ¡  
ÀбâÀü¿¡...

ÀÌ ¹®¼­´Â ¡¸Node.jsªËªªª±ªë«×«í«È«¿«¤«×çýæøÍô撃ªÈªÏù¼ª«¡¹¸¦ ¹ø¿ªÇÑ ±ÛÀÔ´Ï´Ù. ¿øÀÛÀÚ¿¡°Ô ¹ø¿ª ¹× ¹èÆ÷ Çã¶ôÀ» ¹Þ¾Ò½À´Ï´Ù. ÇÁ·ÎÅäŸÀÔ ¿À¿° Ãë¾à¼ºÀÌ ¸¹Àº ºÐ¿¡°Ô ¾Ë·ÁÁö±æ ¹Ù¶ø´Ï´Ù.

½ÃÀÛÇϸ鼭

ÃÖ±Ù ±î´ßÀÌ ÀÖ¾î ³ëµåÀÇ º¸¾È »çÇ×À» Á¶»çÇÏ°í Àִµ¥¿ä. ¿ÃÇØ 5¿ù¿¡ °³ÃֵȠNorth Sec 2018, º¸¾È ¿¬±¸ÀÚ Olivier ArteauÀÇ ¡°Prototype pollution attacks in NodeJS applications¡°¶ó´Â Àç¹ÌÀÖ´Â ¹ßÇ¥¸¦ ¹ß°ßÇß½À´Ï´Ù.

ÀÌ ¹ßÇ¥ÀÇ ³í¹®, ¹ßÇ¥ ÀÚ·á, µ¥¸ð ¿µ»óÀ» ±êÇãºê¿¡ °ø°³ÇßÀ¸¸ç ¶§¸¶Ä§ ¹ßÇ¥ ¿µ»óµµ À¯Æ©ºê¸¦ ÅëÇØ °ø°³µÆ½À´Ï´Ù.

ÀÌ ¹ßÇ¥¿¡¼­´Â °ø°ÝÀÚ°¡ ÀÚ¹Ù½ºÅ©¸³Æ® ¾ð¾î °íÀ¯ÀÇ ÇÁ·ÎÅäŸÀÔ Ã¼ÀÎ µ¿ÀÛ ¿ø¸®¸¦ ÀÌ¿ëÇØ À¥ ¼­¹ö¸¦ °ø°ÝÇÏ´Â ¹æ¹ýÀ» À̾߱âÇÕ´Ï´Ù.

¹ßÇ¥ÀÚ´Â npm¿¡¼­ ¹ÞÀ» ¼ö ÀÖ´Â ¸ðµâÀ» Á¶»çÇØ lodash¸¦ ½ÃÀÛÀ¸·Î ¸¹Àº ¸ðµâ¿¡ ÇÁ·ÎÅäŸÀÔ ¿À¿° Ãë¾àÁ¡ÀÌ ÀÖ´Â °ÍÀ» ¹ß°ßÇÏ°í º¸°íÇß½À´Ï´Ù. ±×¸®°í ½ÇÁ¦ Ãë¾àÁ¡ÀÌ ÀÖ´Â Ghost CMS¸¦ ÀÌ¿ë, ºñ¹Ð¹øÈ£ Àç¼³Á¤ ¿äû¿¡ ÇÊ¿äÇÑ µ¥ÀÌÅ͸¦ º¯Á¶ÇØ ¼­¹ö»ó¿¡¼­ °è»ê±â ¾ÖÇø®ÄÉÀ̼ÇÀ» ½ÇÇà½ÃÅ°´Â µ¥¸ð±îÁö ¼º°øÇÕ´Ï´Ù.

ÀÚ¹Ù½ºÅ©¸³Æ® ½ÇÇà ȯ°æ¿¡ ÀÖ¾î ÇÁ·ÎÅäŸÀÔ ¿À¿° ¹ß»ý À§Ç輺Àº ¿À·¡ÀüºÎÅÍ À̾߱⠵Š¿ÔÁö¸¸ ÀÌ°ÍÀÌ Node.js ȯ°æÀÇ À¥ ¼­¹ö¸¦ °ø°ÝÇϴµ¥ È°¿ëµÉ °ÍÀ̶ó°í´Â »ý°¢Áö ¸øÇßÀ» °Í °°½À´Ï´Ù.

ÀÌ ¹®¼­¿¡¼­´Â °³ÀÎÀûÀ¸·Îµµ ±â¾ïÇØµÑ °â ÇØ´ç °ø°ÝÀÇ ¿ø¸®¿¡ °üÇؼ­ ¼³¸íÇÏ°íÀÚ ÇÕ´Ï´Ù.

__proto__

°´Ã¼ÀÇ ÇÁ·ÎÅäŸÀÔÀ» ÂüÁ¶Çϴ __proto__´Â ¿¹·ÎºÎÅÍ º¸ÆíÀûÀ¸·Î »ç¿ëÇØ¿Â ±â´ÉÀÔ´Ï´Ù. Á¤½Ä »ç¾çÀº ¾Æ´Ï¾úÁö¸¸, ½ÇÁ¤°ú ±¸Çö ÇöȲÀ» ¼Ò±Þ ÀÎÁ¤ÇÏ°í ºê¶ó¿ìÀú °£ ȣȯÀ» À§ÇØ ECMAScript2015 »ç¾ç¿¡ Ãß°¡µÆ½À´Ï´Ù.

ÀÌ ¿Ü¿¡µµ __proto__¿¡ ´ëÇÑ °ÔÅÍ / ¼ÂÅÍ¿Í °°Àº ±â´ÉÀΠObject.setPrototypeOf / getPrototypeOfµµ ±ÔÁ¤µÅ ÀÖ½À´Ï´Ù. ÇöÀç Node.js ȯ°æ¿¡¼­µµ ¸ðµÎ »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù. ÇÏÁö¸¸ MDN¿¡¼­´Â ÇÁ·ÎÅäŸÀÔÀ» º¯°æÇÏ´Â °ÍÀ» ºñ±ÇÀåÇÕ´Ï´Ù.

ÇÁ·ÎÅäŸÀÔ ¿À¿°

ÇÁ·ÎÅäŸÀÔ ¿À¿°Àº ¹«¾ùÀϱî. ¹æ¹ý¿¡´Â ¿©·¯ °¡Áö ÀÖ°ÚÁö¸¸ °¡Àå ±âº»Àº °´Ã¼ ¸®ÅÍ·²ÀÇ __proto__´Â Object.prototype°ú °°´Ù´Â °ÍÀ» ÀÌ¿ëÇØ ´Ù¸¥ °´Ã¼ ¼Ó¼º¿¡ ¿µÇâÀ» ÁÖ´Â ¹æ½ÄÀÔ´Ï´Ù.

const obj1 = {};
console.log(obj1.__proto__ === Object.prototype); // true
obj1.__proto__.polluted = 1;
const obj2 = {};
console.log(obj2.polluted); // 1

À§ ¿¹Á¦¿¡¼­ obj1ÀÇ ÇÁ·ÎÅäŸÀÔ °´Ã¼¸¦ Á¶ÀÛÇß½À´Ï´Ù. ÀÌÁ¦ ¾Æ¹« °ü°è ¾ø´Â obj2 ¼Ó¼ºÀÇ °ª(obj2.polluted)ÀÌ undefined°¡ ¾Æ´Ï¶ó 1·Î Ãâ·ÂµË´Ï´Ù.

¹ßÇ¥¿¡¼­´Â ¾Æ·¡¿Í °°Àº °´Ã¼ ÇÁ·ÎÅäŸÀÔ ¿À¿°ÀÌ ÀϾ ¼ö ÀÖ´Â ¼¼ °¡Áö ÆÐÅÏÀ» ¼Ò°³ÇÕ´Ï´Ù. ¸ðµÎ __proto__À» Æ÷ÇÔÇÑ ¹®ÀÚ¿­À» key·Î ÀÌ¿ëÇØ Á¤È®ÇÏÁö ¾ÊÀº µ¥ÀÌÅ͸¦ °´Ã¼¿¡ µî·Ï ½ÃÄÑ Object.prototype ¿À¿°À» ³ë¸®´Â ¹æ½ÄÀÔ´Ï´Ù.

¼Ó¼º ¼³Á¤

function isObject(obj) {
  return obj !== null && typeof obj === 'object';
}
 
function setValue(obj, key, value) {
  const keylist = key.split('.');
  const e = keylist.shift();
  if (keylist.length > 0) {
    if (!isObject(obj[e])) obj[e] = {};
    setValue(obj[e], keylist.join('.'), value);
  } else {
    obj[key] = value;
    return obj;
  }
}
 
const obj1 = {};
setValue(obj1, "__proto__.polluted", 1);
const obj2 = {};
console.log(obj2.polluted); // 1

°´Ã¼ º´ÇÕ

function merge(a, b) {
  for (let key in b) {
    if (isObject(a[key]) && isObject(b[key])) {
      merge(a[key], b[key]);
    } else {
      a[key] = b[key];
    }
  }
  return a;
}
 
const obj1 = {a: 1, b:2};
const obj2 = JSON.parse('{"__proto__":{"polluted":1}}');
merge(obj1, obj2);
const obj3 = {};
console.log(obj3.polluted); // 1

°´Ã¼ º¹»ç

function clone(obj) {
  return merge({}, obj);
}
 
const obj1 = JSON.parse('{"__proto__":{"polluted":1}}');
const obj2 = clone(obj1);
const obj3 = {};
console.log(obj3.polluted); // 1

À§¿Í ºñ½ÁÇÑ ±â´ÉÀ» Á¦°øÇÏ´Â À¯Àú ¸ðµâ¿¡¼­ ÇÁ·ÎÅäŸÀÔ ¿À¿° Ãë¾àÁ¡ÀÌ ¹ß°ß, ¼öÁ¤µÇ°í ÀÖ½À´Ï´Ù. ¼öÁ¤µÈ ºÎºÐÀ» »ìÆ캸¾Ò´Âµ¥ key¿¡ __proto__°¡ ÀÖÀ» °æ¿ì °Ç³Ê¶Ùµµ·Ï µÅ ÀÖ½À´Ï´Ù.

°ø°ÝÀÚ´Â ¿ÜºÎ¿¡¼­ Object.prototypeÀ» Á¶ÀÛÇÒ ¼ö Àֱ⠶§¹®¿¡ for-in ¹®ÀÇ ¿ÀÀÛµ¿À» ³ë·Á ¾ÇÀÇÀûÀ¸·Î ¼Ó¼ºÀ» ¼öÁ¤Çϰųª toString, valueOf µîÀÇ ¸Þ¼­µå¸¦ ÀçÁ¤ÀÇÇÒ ¼öµµ ÀÖ½À´Ï´Ù. DoS´Â °£´ÜÇÏ°Ô ÀÏÀ¸Å³ ¼ö Àְڳ׿ä.

½ÇÁ¦ °ø°Ý

¹ßÇ¥¿¡¼­´Â ½ÇÁ¦ CMS ¼­¹ö¿¡ ºñ¹Ð¹øÈ£ Àç¼³Á¤¿¡ ÇÊ¿äÇÑ JSONÀ» Á¶ÀÛÇØ °ø°ÝÇÏ´Â ¹æ¹ýÀ» ¼Ò°³ÇÕ´Ï´Ù.

¾ÆÀÌ·¯´ÏÇÏ°Ô °´Ã¼ ÇÁ·ÎÅäŸÀÔ ¿À¿° °ø°ÝÀÌ ¼º°øÇÑ °æ¿ì¿¡ ¼­¹ö Å©·¡½Ã ¾øÀÌ µ¿ÀÛÇϵµ·Ï ÇÏ´Â °ÍÀº ²Ï ¾î·Á¿î ±â¼úÀÔ´Ï´Ù. µ¥¸ð¿¡¼­´Â ¿©·¯°¡Áö ¹æ¾ÈÀ» °í¾ÈÇØ CMS ÅÛÇø´À» Á¶ÀÛÇÏ°í, Å×½ºÆ®¿ëÀ¸·Î ³²°ÜÁ® ÀÖ´Â ÅÛÇø´À» Á¶ÀÛÇÏ¿© ÀÓÀÇÀÇ ÀÚ¹Ù½ºÅ©¸³Æ®¸¦ ¼­¹ö»ó¿¡¼­ ½ÇÇà(°è»ê±â ¾ÛÀ» ½ÃÀÛ) ½ÃÅ°´Â °úÁ¤À» º¸¿©ÁÝ´Ï´Ù.

ÀÌ ±Û¿¡¼­´Â JSONÀ» ¹Þ¾Æ ¾î¶°ÇÑ Ã³¸®¸¦ ÇÏ´Â °£´ÜÇÑ À¥ API ¼­¹ö¸¦ ÀÌ¿ëÇØ ÇÁ·ÎÅäŸÀÔ ¿À¿° °ø°Ý¿¡ ÀÇÇØ ÀÀ´äÀÌ Á¶À۵Ǵ »ùÇÃÀ» ¼Ò°³ÇÕ´Ï´Ù.

´ÙÀ½Àº ¼­¹ö ÄÚµåÀÔ´Ï´Ù. ¿ÜºÎ¿¡¼­ Àü´Þ¹ÞÀº JSONÀ» ±×´ë·Î º¹»çÇÏ°í ÀÖ½À´Ï´Ù.

function isObject(obj) {
  return obj !== null && typeof obj === 'object';
}
 
function merge(a, b) {
  for (let key in b) {
    // ÀÌ ºÎºÐ¿¡¼­ key°¡ __proto__ ÀÏ ¶§¿¡ °Ç³Ê¶Ù¾î¾ß ÇÑ´Ù.
    if (isObject(a[key]) && isObject(b[key])) {
      merge(a[key], b[key]);
    } else {
      a[key] = b[key];
    }
  }
  return a;
}
 
function clone(obj) {
  return merge({}, obj);
}
 
const express = require('express');
const app = express();
app.use(express.json());
app.post('/', (req, res) => {
  // ¿©±â¿¡¼­ ¾ÇÀÇÀûÀÎ JSONÀ» ±×´ë·Î º¹»çÇÔÀ¸·Î½á °´Ã¼ÀÇ ÇÁ·ÎÅäŸÀÔ ¿À¿°ÀÌ ÀϾ´Ù
  const obj = clone(req.body);
  const r = {};
  // ÇÁ·ÎÅäŸÀÔ ¿À¿°¿¡ ÀÇÇØ r.status°¡ º¯Á¶µÈ´Ù.
  const status = r.status ? r.status: 'NG';
  res.send(status)
});
app.listen(1234);

Ŭ¶óÀ̾ðÆ®´Â __proto__ ¼Ó¼ºÀ» °®´Â JSONÀ» ¼­¹ö¿¡ Àü´ÞÇØ °ø°ÝÇÕ´Ï´Ù.

const http = require('http');
const client = http.request({
  host: 'localhost',
  port: 1234,
  method: 'POST'
}, (res) => {
  res.on('data', (chunk) => {
    console.log(chunk.toString());
  });
});
const data = '{"__proto__":{"status":"polluted"}}';
client.setHeader('content-type', 'application/json');
client.end(data);

°ø°Ý °á°ú. Àü´ÞÇÑ JSON¿¡ ÀÇÇØ ¼­¹öÀÇ °´Ã¼ ÇÁ·ÎÅäŸÀÔÀÌ ¿À¿°µÅ ÀÀ´äÀÇ °ªÀÌ NG°¡ ¾Æ´Ï¶ó polluted·Î º¯°æµÅ ³»·Á¿É´Ï´Ù.

$ node client.js
polluted

´ëÃ¥

ÀÌ °ø°ÝÀ» ¹æÁöÇÏ´Â ´ëÃ¥À¸·Î ´ÙÀ½ ¼¼ °¡Áö ¹æ¹ýÀÌ ÀÖ½À´Ï´Ù.

  • Object.freeze : Object.prototypeÀ̳ª Object¸¦ freezeÇÏ¿© º¯°æÀ» ºÒ°¡´ÉÇÏ°Ô ÇÏ´Â ¹æ¹ýÀÔ´Ï´Ù. ºÎÀÛ¿ëÀ¸·Î Á¤»óÀûÀÎ ¸ðµâÀÓ¿¡µµ ÀÌ Á¶Ä¡·Î µ¿ÀÛÇÏÁö ¾ÊÀ» ¼öµµ ÀÖ½À´Ï´Ù.
  • JSON schema : avj ¸ðµâ µîÀ» »ç¿ëÇØ JSONÀ» °ËÁõÇÕ´Ï´Ù.
  • Map : key / value¸¦ ÀúÀåÇϴµ¥ °´Ã¼¸¦ »ç¿ëÇÏÁö ¾Ê°í MapÀ» »ç¿ëÇÕ´Ï´Ù. ´Ü, ES5 ÀÌÀü ȯ°æ¿¡¼­´Â »ç¿ëÇÒ ¼ö ¾ø½À´Ï´Ù.

ÀǽÄÇÏÁö ¾ÊÀ¸¸é ¾ðÁ¦µçÁö ÀÌ Ãë¾àÁ¡ÀÌ ³ëÃâµÉ ¼ö ÀÖ½À´Ï´Ù.

Á¤¸®

ÀÌ ±ÛÀ» Á¤¸®Çϸ鼭µµ ´Ù¸¥ °´Ã¼¸¦ ´Ü¼øÈ÷ ±íÀº º¹»ç ÇÏ´Â °Í¸¸À¸·Î Ãë¾àÁ¡ÀÌ ³ëÃâµÈ´Ù´Â »ç½Ç¿¡ ³î¶ú½À´Ï´Ù. ¿ª½Ã ¿ÜºÎ¿¡¼­ Àü´Þ¹ÞÀº µ¥ÀÌÅ͸¦ ó¸®ÇÒ ¶§¿£ ½ÅÁßÇØ¾ß ÇÕ´Ï´Ù.

Ãë¾àÁ¡ÀÌ ¾Ë·ÁÁø »ç¿ëÀÚ ¸ðµâ ´ëºÎºÐÀº ÀÌ¹Ì °íÃÄÁø »óÅÂÀÔ´Ï´Ù. ±×·³¿¡µµ ½Å°æ ¾²Àδٸé Çѹø npm auditÀ¸·Î È®ÀÎÇغ¸½Ã±â ¹Ù¶ø´Ï´Ù.

$ npm audit
 
                       === npm audit security report ===
 
# Run  npm install lodash@4.17.11  to resolve 1 vulnerability
 
  Low             Prototype Pollution
 
  Package         lodash
 
  Dependency of   lodash
 
  Path            lodash
 
  More info       https://nodesecurity.io/advisories/577
 
 
 
found 1 low severity vulnerability in 1 scanned package
  run `npm audit fix` to fix 1 of them.

                   
¹øÈ£±¸ºÐÁ¦ ¸ñÀ帣
3970 À¯Æ¿    The macOS and Linux Disassembler µð½º¾î¼Àºí·¯ 
3969 ¹®¼­    IDOR (Insecure Direct Object Reference) ±âŸ  
3968 Á¤º¸    LotL °ø°ÝÀ̶õ? ±âŸ  
3967 Á¤º¸    Node.js¿¡¼­ÀÇ ÇÁ·ÎÅäŸÀÔ ¿À¿° °ø°ÝÀ̶õ ¹«¾ùÀΰ¡ ±âŸ  
3966 Á¤º¸    ·¯½Ã¾Æ ±¹¹æºÎ ¾ÆÀ̵ð/ºñ¹ø ±âŸ  
3965 À¯Æ¿    Ãë¾àÁ¡ ½ºÄ³³Ê - Arachni ½ºÄ³³Ê 
3964 À¯Æ¿    Sqli µµ±¸ havij ¼Ò½ºÄÚµå SQLi 
3963 À¯Æ¿    ¾Ç¼ºÄÚµå ºÐ¼®µµ±¸ - Malcat µð½º¾î¼Àºí·¯ 
3962 Á¤º¸    ¸íÀýÀ» ´ëºñÇÑ ½º¸¶Æ®Æù º¸¾È ¼öÄ¢ 10´Ü°è~ ½º¸¶Æ®Æù 
3961 À¯Æ¿    ¹éµµ¾î, dll ÀÎÁ§¼Ç, ÇÁ·Î¼¼½º ¹«°á¼º ŽÁö±â ¹éµµ¾î 
3960 ¼Ò½º    2022³âµµ ÃֽŠÅø ¸ðÀ½ - 12.5 GB Á¾ÇÕÅø 

 
óÀ½ ÀÌÀü ´ÙÀ½       ¸ñ·Ï