From cc6bf46a9e5f0bc7c7ee87ecfb3184c2bf952034 Mon Sep 17 00:00:00 2001 From: "mrbkap@gmail.com" Date: Fri, 15 Jun 2007 14:44:51 -0700 Subject: [PATCH] Restrict who can claim to implement nsISecurityCheckedComponent. bug 352882, r=jst sr=bzbarsky --- js/src/xpconnect/src/xpcwrappedjsclass.cpp | 38 ++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/js/src/xpconnect/src/xpcwrappedjsclass.cpp b/js/src/xpconnect/src/xpcwrappedjsclass.cpp index 00d8d1a1bac8..849d79f290c3 100644 --- a/js/src/xpconnect/src/xpcwrappedjsclass.cpp +++ b/js/src/xpconnect/src/xpcwrappedjsclass.cpp @@ -593,6 +593,44 @@ nsXPCWrappedJSClass::DelegatedQueryInterface(nsXPCWrappedJS* self, // else we do the more expensive stuff... +#ifndef XPCONNECT_STANDALONE + // Before calling out, ensure that we're not about to claim to implement + // nsISecurityCheckedComponent for an untrusted object. Doing so causes + // problems. See bug 352882. + + if(aIID.Equals(NS_GET_IID(nsISecurityCheckedComponent))) + { + // XXX This code checks to see if the given object has chrome (also + // known as system) principals. It really wants to do a + // UniversalXPConnect type check. + + nsXPConnect *xpc = nsXPConnect::GetXPConnect(); + nsCOMPtr secMan = + do_QueryInterface(xpc->GetDefaultSecurityManager()); + if(!secMan) + { + *aInstancePtr = nsnull; + return NS_NOINTERFACE; + } + nsCOMPtr objPrin; + nsresult rv = secMan->GetObjectPrincipal(ccx, self->GetJSObject(), + getter_AddRefs(objPrin)); + if(NS_SUCCEEDED(rv)) + { + nsCOMPtr systemPrin; + rv = secMan->GetSystemPrincipal(getter_AddRefs(systemPrin)); + if(systemPrin != objPrin) + rv = NS_NOINTERFACE; + } + + if(NS_FAILED(rv)) + { + *aInstancePtr = nsnull; + return rv; + } + } +#endif + // check if the JSObject claims to implement this interface JSObject* jsobj = CallQueryInterfaceOnJSObject(ccx, self->GetJSObject(), aIID);