{"record":{"id":"4a564a1205bbc72c","repo":"frohoff/ysoserial","slug":"failed-to-get-object-id-separator","errorCode":null,"errorMessage":"Failed to get object id, separator","messagePattern":"Failed to get object id, separator","errorType":"exception","errorClass":"Exception","httpStatus":null,"severity":"error","filePath":"src/main/java/ysoserial/exploit/JenkinsListener.java","lineNumber":139,"sourceCode":"        return reqCons\n                .newInstance(oid, JarLoader.class.getMethod(\"isPresentOnRemote\", Class.forName(\"hudson.remoting.Checksum\")), new Object[] {\n                    uro,\n        });\n    }\n\n\n    private static void parseObjIdAndExploit ( final String[] args, final Class<? extends ObjectPayload> payloadClass, int jrmpPort,\n            InetSocketAddress isa, Exception e ) throws Exception, IOException {\n        String msg = e.getMessage();\n        int start = msg.indexOf(\"objID:[\");\n        if ( start < 0 ) {\n            throw new Exception(\"Failed to get object id\");\n        }\n\n        int sep = msg.indexOf(\", \", start + 1);\n\n        if ( sep < 0 ) {\n            throw new Exception(\"Failed to get object id, separator\");\n        }\n\n        int end = msg.indexOf(\"]\", sep + 1);\n\n        if ( end < 0 ) {\n            throw new Exception(\"Failed to get object id, separator\");\n        }\n\n        String uid = msg.substring(start + 7, sep);\n        String objNum = msg.substring(sep + 2, end);\n\n        System.err.println(\"* UID is \" + uid);\n        System.err.println(\"* ObjNum is \" + objNum);\n\n        String[] parts = uid.split(\":\");\n\n        long obj = Long.parseLong(objNum);\n        int o1 = Integer.parseInt(parts[ 0 ], 16);","sourceCodeStart":121,"sourceCodeEnd":157,"githubUrl":"https://github.com/frohoff/ysoserial/blob/218bcffcaaa904a4e392f0c15d9e2874533635a3/src/main/java/ysoserial/exploit/JenkinsListener.java#L121-L157","documentation":"After locating 'objID:[', parseObjIdAndExploit searches for the \", \" separator between the UID and object number inside the message. If indexOf(\", \") after the start marker returns -1, it throws Exception(\"Failed to get object id, separator\").","triggerScenarios":"The exception message contains 'objID:[' but no ', ' following it — the ObjID.toString() rendering differs from 'objID:[<uid>, <num>]' expected by the parser, e.g. a different Java version's UID format.","commonSituations":"Running against a JDK whose UID/ObjID toString output changed format; a message truncated after 'objID:['; localization or subclassed exception altering the text.","solutions":["Log e.getMessage() and confirm the exact ObjID rendering on the target's Java version","Update the parser markers to match the actual format","Regenerate/parse the objID client-side instead of scraping exception text if the format keeps drifting","Pin the exploit host JDK version known to match the parser's expected format"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":"String msg = e.getMessage();\nint start = msg.indexOf(\"objID:[\");\nif (start >= 0 && msg.indexOf(\", \", start + 1) < 0) {\n    System.err.println(\"unexpected objID format on this JDK: \" + msg);\n}","typeGuard":null,"tryCatchPattern":"try {\n    parseObjIdAndExploit(args, payloadClass, jrmpPort, isa, e);\n} catch (Exception ex) {\n    if (ex.getMessage().contains(\"separator\")) {\n        // print raw message and adapt parser markers to target JDK format\n    }\n}","preventionTips":["Log e.getMessage() verbatim before parsing","Verify ObjID/UID toString format on the target's JDK version","Prefer computing the objID over scraping exception text"],"tags":["java","rmi","jenkins","parsing"],"backgroundTag":"unexpected-response-shape","analyzedSha":"218bcffcaaa904a4e392f0c15d9e2874533635a3","analyzedAt":"2026-09-12T01:53:58.488Z","contentChangedAt":"2026-09-12T01:53:58.488Z","schemaVersion":2},"datasetVersion":"2026-09-16T04:17:20.429Z"}