Vm2: λŒ€λΆ€λΆ„μ˜ λ‚΄μž₯ λͺ¨λ“ˆμ΄ μƒŒλ“œλ°•μŠ€μ—μ„œ ν•„μš”ν•˜μ§€ μ•Šκ³  ν”„λ‘μ‹œλ˜λŠ” μ΄μœ κ°€ μžˆμŠ΅λ‹ˆκΉŒ?

에 λ§Œλ“  2017λ…„ 10μ›” 17일  Β·  5μ½”λ©˜νŠΈ  Β·  좜처: patriksimek/vm2

μ•ˆλ…•,
λ‚΄μž₯ λͺ¨λ“ˆμ΄ ν˜ΈμŠ€νŠΈμ—μ„œ ν”„λ‘μ‹œλ˜κ³  VMμ—μ„œ ν•„μš”ν•˜μ§€ μ•Šμ€ 이유λ₯Ό νŒŒμ•…ν•˜λ €κ³  ν•©λ‹ˆλ‹€.

이것은 ν˜„μž¬ λ‚΄ μ„€μ •μž…λ‹ˆλ‹€.

const vm = new NodeVM({
        require: {
            external: true,
            context: 'sandbox',
            builtin: ['*'],
        },
    });

vm.run(...);

VM λ‚΄λΆ€μ—λŠ” μ™ΈλΆ€ λͺ¨λ“ˆ(μ€‘μš”ν•œ 경우 axios )이 ν•„μš”ν•˜κ³  쒅속성 μ²΄μΈμ—λŠ” 이λ₯Ό μˆ˜ν–‰ν•˜λŠ” λ‹€λ₯Έ λͺ¨λ“ˆ( follow-redirects )이 ν•„μš”ν•©λ‹ˆλ‹€.

var Writable = require('stream').Writable;

function RedirectableRequest(options, responseCallback) {
// .....
}

RedirectableRequest.prototype = Object.create(Writable.prototype);

RedirectableRequest.prototype._performRequest = function () {  // <-------- this line breaks
// ..........
}

VM λ‚΄μ—μ„œ 이 μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜λ©΄ TypeError: 'set' on proxy: '_performRequest' 속성에 λŒ€ν•΄ falseκ°€ λ°˜ν™˜λ˜μ—ˆμŠ΅λ‹ˆλ‹€.
슀트림 κ°œμ²΄κ°€ VM에 ν”„λ‘μ‹œλ©λ‹ˆλ‹€.

stream κ°€ μ‹€μ œλ‘œ vm λ‚΄λΆ€μ—μ„œ ν•„μš”ν•  λ•Œ 이 μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€(μ—¬κΈ°μ—μ„œ if 문을 μ œκ±°ν•˜μ—¬: https://github.com/patriksimek/vm2/blob/master/lib/sandbox.js#L133). μΌν•˜κ³ μžˆλŠ”.

osxμ—μ„œ λ…Έλ“œ 6.10.3을 μ‹€ν–‰ μ€‘μž…λ‹ˆλ‹€.

감사 ν•΄μš”

stale

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

λ‚˜λŠ” λ˜ν•œ λŒ€μ•ˆ μ†”λ£¨μ…˜μ„ μ°Ύμ•˜μŠ΅λ‹ˆλ‹€(νŒ¨λŸ¬λ‹€μž„μ— 더 μ ν•©ν•˜λ‹€κ³  μƒκ°ν•˜λŠ” μ†”λ£¨μ…˜).

기본적으둜 λ‚΄κ°€ 찾은 것은 μ»¨ν…μŠ€νŠΈν™”λœ μ½”λ“œκ°€ μ»¨ν…μŠ€νŠΈμ—μ„œ μƒμ„±ν–ˆμ§€λ§Œ λ‹€λ₯Έ μ»¨ν…μŠ€νŠΈμ—μ„œ κ°€μ Έμ˜¨ 객체λ₯Ό ν™•μž₯ν•œ 객체의 ν”„λ‘œν† νƒ€μž…μ— μ“°λ €κ³  ν•œλ‹€λŠ” κ²ƒμ΄μ—ˆμŠ΅λ‹ˆλ‹€.

μ„ΈνŠΈ ν”„λ‘μ‹œ ν•Έλ“€λŸ¬μ— λŒ€ν•œ λ¬Έμ„œμ— 따라 μ„€μ •ν•˜λ €λŠ” 객체에 속성이 μ—†μœΌλ©΄ ν”„λ‘œν† νƒ€μž… μ„ΈνŠΈ ν•Έλ“€λŸ¬κ°€ ν˜ΈμΆœλ©λ‹ˆλ‹€.

κ·Έλž˜μ„œ;
물체
원기
<-이 μ„€μ •(μ‹€μ œλ‘œ ν”„λ‘œν† νƒ€μž…μ—λŠ” μ‘΄μž¬ν•˜μ§€ μ•ŠμŒ)
__proto__ (ν”„λ‘μ‹œ)
set: (){} <- μ‹€μ œλ‘œ 이것을 ν˜ΈμΆœν•©λ‹ˆλ‹€.

그리고 set ν•Έλ“€λŸ¬κ°€ 호좜되면 μˆ˜μ‹ κΈ° μΈμˆ˜λŠ” μš°λ¦¬κ°€ μ„€μ •ν•˜λ €κ³  ν–ˆλ˜ μ›λž˜ 객체둜 μ„€μ •λ©λ‹ˆλ‹€. λ‚΄ μ†”λ£¨μ…˜μ€ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

--- a/node_modules/vm2/lib/contextify.js
+++ b/node_modules/vm2/lib/contextify.js
@@ -17,7 +17,23 @@ const DEBUG = false;
 const OPNA = 'Operation not allowed on contextified object.';
 const ERROR_CST = Error.captureStackTrace;
 const FROZEN_TRAPS = {
-   set: (target, key) => false,
+   set: (target, key, value, receiver) => {
+       if( target !== receiver ){
+
+           Object.defineProperty(receiver, key, {
+               value: value,
+               writable: true,
+               enumerable: true,
+               configurable: true
+           })
+
+           return true;
+
+       }
+
+       return false;
+
+   },

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

#127 κ΄€λ ¨

λ‚˜λŠ” κ³„μ†ν•΄μ„œ if 문을 λ‹€μŒκ³Ό 같이 λ³€κ²½ν–ˆμŠ΅λ‹ˆλ‹€.

if( vm.options.require.context === 'sandbox' && modulename !== 'async_hooks' ){

λ…Έλ“œ 8.xμ—μ„œ async_hooks λ¬Έμ œκ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€.

λ‚˜λŠ” λ˜ν•œ λŒ€μ•ˆ μ†”λ£¨μ…˜μ„ μ°Ύμ•˜μŠ΅λ‹ˆλ‹€(νŒ¨λŸ¬λ‹€μž„μ— 더 μ ν•©ν•˜λ‹€κ³  μƒκ°ν•˜λŠ” μ†”λ£¨μ…˜).

기본적으둜 λ‚΄κ°€ 찾은 것은 μ»¨ν…μŠ€νŠΈν™”λœ μ½”λ“œκ°€ μ»¨ν…μŠ€νŠΈμ—μ„œ μƒμ„±ν–ˆμ§€λ§Œ λ‹€λ₯Έ μ»¨ν…μŠ€νŠΈμ—μ„œ κ°€μ Έμ˜¨ 객체λ₯Ό ν™•μž₯ν•œ 객체의 ν”„λ‘œν† νƒ€μž…μ— μ“°λ €κ³  ν•œλ‹€λŠ” κ²ƒμ΄μ—ˆμŠ΅λ‹ˆλ‹€.

μ„ΈνŠΈ ν”„λ‘μ‹œ ν•Έλ“€λŸ¬μ— λŒ€ν•œ λ¬Έμ„œμ— 따라 μ„€μ •ν•˜λ €λŠ” 객체에 속성이 μ—†μœΌλ©΄ ν”„λ‘œν† νƒ€μž… μ„ΈνŠΈ ν•Έλ“€λŸ¬κ°€ ν˜ΈμΆœλ©λ‹ˆλ‹€.

κ·Έλž˜μ„œ;
물체
원기
<-이 μ„€μ •(μ‹€μ œλ‘œ ν”„λ‘œν† νƒ€μž…μ—λŠ” μ‘΄μž¬ν•˜μ§€ μ•ŠμŒ)
__proto__ (ν”„λ‘μ‹œ)
set: (){} <- μ‹€μ œλ‘œ 이것을 ν˜ΈμΆœν•©λ‹ˆλ‹€.

그리고 set ν•Έλ“€λŸ¬κ°€ 호좜되면 μˆ˜μ‹ κΈ° μΈμˆ˜λŠ” μš°λ¦¬κ°€ μ„€μ •ν•˜λ €κ³  ν–ˆλ˜ μ›λž˜ 객체둜 μ„€μ •λ©λ‹ˆλ‹€. λ‚΄ μ†”λ£¨μ…˜μ€ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

--- a/node_modules/vm2/lib/contextify.js
+++ b/node_modules/vm2/lib/contextify.js
@@ -17,7 +17,23 @@ const DEBUG = false;
 const OPNA = 'Operation not allowed on contextified object.';
 const ERROR_CST = Error.captureStackTrace;
 const FROZEN_TRAPS = {
-   set: (target, key) => false,
+   set: (target, key, value, receiver) => {
+       if( target !== receiver ){
+
+           Object.defineProperty(receiver, key, {
+               value: value,
+               writable: true,
+               enumerable: true,
+               configurable: true
+           })
+
+           return true;
+
+       }
+
+       return false;
+
+   },

μƒνƒœκ°€ μ–΄λ–»μŠ΅λ‹ˆκΉŒ? ν”„λ‘œμ νŠΈ 사망?

이 λ¬Έμ œλŠ” 졜근 ν™œλ™μ΄ μ—†μ—ˆκΈ° λ•Œλ¬Έμ— μžλ™μœΌλ‘œ 였래된 κ²ƒμœΌλ‘œ ν‘œμ‹œλ˜μ—ˆμŠ΅λ‹ˆλ‹€. 더 이상 ν™œλ™μ΄ μ—†μœΌλ©΄ νμ‡„λ©λ‹ˆλ‹€. κ·€ν•˜μ˜ 기여에 κ°μ‚¬λ“œλ¦½λ‹ˆλ‹€.

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