I am trying to use Rhino and Cobra for the de-obfuscation and detecting of malicious scripts. The problem is that Rhino has no standard policy for detecting of unknown objects ( it throws RuntimeException) and properties (unknown properties are ignored ) .Cobra defines the standard objects and functions like Window, document.write() , but browsers also define many non-standard objects and methods, like ActiveXObject, and we can expect some new non-standard definitions in future. Therefore it would be good to make simulation of the unknown object/function. The simulation should do nothing except alerting, moreover - it should evaluate parameters of the unknown function - because the parameters inform us very often about malicious URL sources or about files to be read or written, and the parameters are very often obfuscated. Of course if we know the object like the ActiveXObject - it is easy to write a script defining its prototype, and all named properties, including functions like PrintSnapshot. The script can be executed before the main set of malicious scripts - and then we can detect if the malicious script uses PrintSnaphot , what files it tries to open, and to send (because Rhino knows prototype and automatically evaluates the properties: CompressedPath and SnapshotPath of the ActiveXObject ). But I would like to have the same functionality for really non-standard and unknown objects. It would be simple if Rhino informed about all unknown names in a standard way. But it seems to be complicated - because Rhino throws RuntimeException if a name of non-standard ( or not defined by a former script ) OBJECT is found, but for unknown PROPERTY it throws EcmaError, which is caught further on in the Rhino Engine, and only the logger informs about the unknown property. I would prefer to have a choice of three modes: IGNORE_UNKNOWN_OBJECTS_AND_PROPERTIES when unknown objects and properties do not throw runtime exception, only the logger info . IGNORE_UNKNOWN_PROPERTIES ( this is the current mode of Rhino ) THROW_ALL_EXCEPTIONS - in this mode for any unknown name of an object or any unknown property Rhino should throw some kind of exception, with information about the property's owner.
Another mode would be the simulation of the unknown objects and properties - which I described in the beginning. But it cannot be the part of Rhino standard - I am afraid. I am thinking about some changes in the Rhino engine for the option THROW_ALL_EXCEPTIONS. This is not a big task - simply instead of catching - the EcmaError should be rethrown , with some additional information. Next I will try to execute the malicious code with "unknown names " , to catch the exception, extract info , then construct the Javascript with prototypes of the detected "unknown" object or property, execute the new script , and execute the malicious code again in a loop. It will be a longer procedure because only one unknown name can be detected in one loop. Do you have any better advice how to do it in one run - without bigger ingeration in the Rhino code ? Maybe some Rhino debugger methods would be useful - but I have no idea about the Rhino debugger. Tad Slupski _______________________________________________ dev-tech-js-engine-rhino mailing list [email protected] https://lists.mozilla.org/listinfo/dev-tech-js-engine-rhino
