mirror of https://github.com/grpc/grpc-node.git
				
				
				
			Merge pull request #3 from d3v53c/huntr/proto-01
Prototype pollution fix - checking magic attributes - grpc-js
This commit is contained in:
		
						commit
						4cf11dc119
					
				| 
						 | 
				
			
			@ -93,6 +93,15 @@ export interface ServiceClientConstructor {
 | 
			
		|||
  service: ServiceDefinition;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Returns true, if given key is included in the blacklisted
 | 
			
		||||
 * keys.
 | 
			
		||||
 * @param key key for check, string.
 | 
			
		||||
 */
 | 
			
		||||
function isPrototypePolluted(key: string): Boolean {
 | 
			
		||||
  return ['__proto__', 'prototype', 'constructor'].includes(key);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Creates a constructor for a client with the given methods, as specified in
 | 
			
		||||
 * the methods argument. The resulting class will have an instance method for
 | 
			
		||||
| 
						 | 
				
			
			@ -122,7 +131,7 @@ export function makeClientConstructor(
 | 
			
		|||
  }
 | 
			
		||||
 | 
			
		||||
  Object.keys(methods).forEach((name) => {
 | 
			
		||||
    if (name === '__proto__') {
 | 
			
		||||
    if (isPrototypePolluted(name)) {
 | 
			
		||||
      return;
 | 
			
		||||
    }
 | 
			
		||||
    const attrs = methods[name];
 | 
			
		||||
| 
						 | 
				
			
			@ -155,7 +164,7 @@ export function makeClientConstructor(
 | 
			
		|||
    ServiceClientImpl.prototype[name] = methodFunc;
 | 
			
		||||
    // Associate all provided attributes with the method
 | 
			
		||||
    Object.assign(ServiceClientImpl.prototype[name], attrs);
 | 
			
		||||
    if (attrs.originalName && attrs.originalName !== '__proto__') {
 | 
			
		||||
    if (attrs.originalName && !isPrototypePolluted(attrs.originalName)) {
 | 
			
		||||
      ServiceClientImpl.prototype[attrs.originalName] =
 | 
			
		||||
        ServiceClientImpl.prototype[name];
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -204,7 +213,7 @@ export function loadPackageDefinition(
 | 
			
		|||
    if (Object.prototype.hasOwnProperty.call(packageDef, serviceFqn)) {
 | 
			
		||||
      const service = packageDef[serviceFqn];
 | 
			
		||||
      const nameComponents = serviceFqn.split('.');
 | 
			
		||||
      if (nameComponents.some(comp => comp === '__proto__')) {
 | 
			
		||||
      if (nameComponents.some((comp: string) => isPrototypePolluted(comp))) {
 | 
			
		||||
        continue;
 | 
			
		||||
      }
 | 
			
		||||
      const serviceName = nameComponents[nameComponents.length - 1];
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -24,4 +24,8 @@ describe('loadPackageDefinition', () => {
 | 
			
		|||
      loadPackageDefinition({'__proto__.polluted': true} as any);
 | 
			
		||||
      assert.notStrictEqual(({} as any).polluted, true);
 | 
			
		||||
  });
 | 
			
		||||
  it('Should not allow prototype pollution #2', () => {
 | 
			
		||||
      loadPackageDefinition({'constructor.prototype.polluted': true} as any);
 | 
			
		||||
      assert.notStrictEqual(({} as any).polluted, true);
 | 
			
		||||
  });
 | 
			
		||||
});
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue