{"id":17507,"date":"2026-02-21T18:28:37","date_gmt":"2026-02-21T18:28:37","guid":{"rendered":"https:\/\/cryptoted.net\/index.php\/2026\/02\/21\/cve-2025-30147-the-curious-case-of-subgroup-check-on-besu\/"},"modified":"2026-02-21T18:28:37","modified_gmt":"2026-02-21T18:28:37","slug":"cve-2025-30147-the-curious-case-of-subgroup-check-on-besu","status":"publish","type":"post","link":"https:\/\/cryptoted.net\/index.php\/2026\/02\/21\/cve-2025-30147-the-curious-case-of-subgroup-check-on-besu\/","title":{"rendered":"CVE-2025-30147 &#8211; The curious case of subgroup check on Besu"},"content":{"rendered":"<p> <br \/>\n<\/p>\n<div id=\"\">\n<p class=\"chakra-text css-gi02ar\"><em class=\"chakra-text css-0\">Thanks to Marius Van Der Wijden for creating the test case and statetest, and for helping the Besu team confirm the issue. Also, kudos to the Besu team, the EF security team, and Kevaundray Wedderburn. Additionally, thanks to Yuxiang Qiu, Justin Traglia, Marius Van Der Wijden, Benedikt Wagner, and Kevaundray Wedderburn for proofreading. If you have any other questions\/comments, find me on twitter at <a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-vezwxf\" href=\"https:\/\/twitter.com\/asanso\">@asanso<\/a><\/em><\/p>\n<p class=\"chakra-text css-gi02ar\"><strong>tl;dr<\/strong>: <a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-vezwxf\" href=\"https:\/\/besu.hyperledger.org\/\">Besu Ethereum execution client<\/a> version 25.2.2 suffered from a <strong>consensus issue<\/strong> related to the <a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-vezwxf\" href=\"https:\/\/eips.ethereum.org\/EIPS\/eip-196\">EIP-196<\/a>\/<a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-vezwxf\" href=\"https:\/\/eips.ethereum.org\/EIPS\/eip-197\">EIP-197<\/a> precompiled contract handling for the elliptic curve <span class=\"chakra-text css-ons8vw\">alt_bn128<\/span> (a.k.a. bn254). The issue was fixed in release <a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-vezwxf\" href=\"https:\/\/github.com\/hyperledger\/besu\/releases\/tag\/25.3.0\">25.3.0<\/a>.<br \/>\n<a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-vezwxf\" href=\"https:\/\/nvd.nist.gov\/vuln\/detail\/CVE-2025-30147\">Here<\/a> is the full CVE report.<\/p>\n<p class=\"chakra-text css-gi02ar\"><strong>N.B.<\/strong>: Part of this post requires some knowledge about elliptic curves (cryptography).<\/p>\n<h2 class=\"chakra-heading group css-1kpzc4q\" id=\"introduction\" data-group=\"true\"><a class=\"chakra-link css-128fqrf\" aria-label=\"introduction permalink\" href=\"#introduction\"><svg viewbox=\"0 0 24 24\" focusable=\"false\" class=\"chakra-icon css-173jpr1\"><g fill=\"currentColor\"><path d=\"M10.458,18.374,7.721,21.11a2.853,2.853,0,0,1-3.942,0l-.892-.891a2.787,2.787,0,0,1,0-3.941l5.8-5.8a2.789,2.789,0,0,1,3.942,0l.893.892A1,1,0,0,0,14.94,9.952l-.893-.892a4.791,4.791,0,0,0-6.771,0l-5.8,5.8a4.787,4.787,0,0,0,0,6.77l.892.891a4.785,4.785,0,0,0,6.771,0l2.736-2.735a1,1,0,1,0-1.414-1.415Z\"\/><path d=\"M22.526,2.363l-.892-.892a4.8,4.8,0,0,0-6.77,0l-2.905,2.9a1,1,0,0,0,1.414,1.414l2.9-2.9a2.79,2.79,0,0,1,3.941,0l.893.893a2.786,2.786,0,0,1,0,3.942l-5.8,5.8a2.769,2.769,0,0,1-1.971.817h0a2.766,2.766,0,0,1-1.969-.816,1,1,0,1,0-1.415,1.412,4.751,4.751,0,0,0,3.384,1.4h0a4.752,4.752,0,0,0,3.385-1.4l5.8-5.8a4.786,4.786,0,0,0,0-6.771Z\"\/><\/g><\/svg><\/a>Introduction<\/h2>\n<p class=\"chakra-text css-gi02ar\">The <span class=\"chakra-text css-ons8vw\">bn254<\/span> curve (also known as <span class=\"chakra-text css-ons8vw\">alt_bn128<\/span>) is an elliptic curve used in Ethereum for cryptographic operations. It supports operations such as elliptic curve cryptography, making it crucial for various Ethereum features. Prior to <a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-vezwxf\" href=\"https:\/\/eips.ethereum.org\/EIPS\/eip-2537\">EIP-2537<\/a> and the recent Pectra release, <span class=\"chakra-text css-ons8vw\">bn254<\/span> was the only pairing curve supported by the Ethereum Virtual Machine (EVM). <a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-vezwxf\" href=\"https:\/\/eips.ethereum.org\/EIPS\/eip-196\">EIP-196<\/a> and <a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-vezwxf\" href=\"https:\/\/eips.ethereum.org\/EIPS\/eip-197\">EIP-197<\/a> define precompiled contracts for efficient computation on this curve. For more details about <span class=\"chakra-text css-ons8vw\">bn254<\/span>, you can read <a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-vezwxf\" href=\"https:\/\/hackmd.io\/@jpw\/bn254\">here<\/a>.<\/p>\n<p class=\"chakra-text css-gi02ar\">A significant security vulnerability in elliptic curve cryptography is the <strong>invalid curve attack<\/strong>, first introduced in the paper <a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-vezwxf\" href=\"https:\/\/www.iacr.org\/archive\/crypto2000\/18800131\/18800131.pdf\">\u201cDifferential fault attacks on elliptic curve cryptosystems\u201d<\/a>. This attack targets the use of points that do not lie on the correct elliptic curve, leading to potential security issues in cryptographic protocols. For non-prime order curves (like those appearing in pairing-based cryptography and in <span class=\"math math-inline\"><span class=\"katex\"><span class=\"katex-mathml\"><math xmlns=\"http:\/\/www.w3.org\/1998\/Math\/MathML\"><semantics><mrow><msub><mi>G<\/mi><mn>2<\/mn><\/msub><\/mrow><annotation encoding=\"application\/x-tex\">G_2<\/annotation><\/semantics><\/math><\/span><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"base\"><span class=\"strut\" style=\"height:0.8333em;vertical-align:-0.15em\"\/><span class=\"mord\"><span class=\"mord mathnormal\">G<\/span><span class=\"msupsub\"><span class=\"vlist-t vlist-t2\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.3011em\"><span style=\"top:-2.55em;margin-left:0em;margin-right:0.05em\"><span class=\"pstrut\" style=\"height:2.7em\"\/><span class=\"sizing reset-size6 size3 mtight\"><span class=\"mord mtight\">2<\/span><\/span><\/span><\/span><span class=\"vlist-s\">\u200b<\/span><\/span><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.15em\"><span\/><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span> for <span class=\"chakra-text css-ons8vw\">bn254<\/span>), it is especially important that the point <strong>is in the correct subgroup<\/strong>. If the point does not belong to the correct subgroup, the cryptographic operation can be manipulated, potentially compromising the security of systems relying on elliptic curve cryptography.<\/p>\n<p class=\"chakra-text css-gi02ar\">To check if a point <span class=\"chakra-text css-ons8vw\">P<\/span> is valid in elliptic curve cryptography, it must be verified that the point lies on the curve and belongs to the correct subgroup. This is especially critical when the point <span class=\"chakra-text css-ons8vw\">P<\/span> comes from an untrusted or potentially malicious source, as invalid or specially crafted points can lead to security vulnerabilities. Below is pseudocode demonstrating this process:<\/p>\n<div class=\"chakra-stack css-1jx0in4\">\n<pre><pre style=\"color:white;font-family:Consolas, Monaco, &quot;Andale Mono&quot;, &quot;Ubuntu Mono&quot;, monospace;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;font-size:1em;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none;padding:1em;margin:0.5em 0;overflow:auto;background:#011627\"><code class=\"language-python\" style=\"color:#d6deeb;font-family:Consolas, Monaco, &quot;Andale Mono&quot;, &quot;Ubuntu Mono&quot;, monospace;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;font-size:1em;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none\"><span class=\"token\" style=\"color:rgb(99, 119, 119);font-style:italic\"># Pseudocode for checking if point P is valid<\/span><span>\n<\/span><span\/><span class=\"token\" style=\"color:rgb(127, 219, 202)\">def<\/span><span> <\/span><span class=\"token\" style=\"color:rgb(130, 170, 255)\">is_valid_point<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">(<\/span><span>P<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">)<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">:<\/span><span>\n<\/span><span>    <\/span><span class=\"token\" style=\"color:rgb(127, 219, 202)\">if<\/span><span> <\/span><span class=\"token\" style=\"color:rgb(127, 219, 202)\">not<\/span><span> is_on_curve<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">(<\/span><span>P<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">)<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">:<\/span><span>    \n<\/span><span>        <\/span><span class=\"token\" style=\"color:rgb(127, 219, 202)\">return<\/span><span> <\/span><span class=\"token\" style=\"color:rgb(255, 88, 116)\">False<\/span><span>\n<\/span><span>    <\/span><span class=\"token\" style=\"color:rgb(127, 219, 202)\">if<\/span><span> <\/span><span class=\"token\" style=\"color:rgb(127, 219, 202)\">not<\/span><span> is_in_subgroup<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">(<\/span><span>P<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">)<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">:<\/span><span>\n<\/span><span>        <\/span><span class=\"token\" style=\"color:rgb(127, 219, 202)\">return<\/span><span> <\/span><span class=\"token\" style=\"color:rgb(255, 88, 116)\">False<\/span><span>\n<\/span><span>    <\/span><span class=\"token\" style=\"color:rgb(127, 219, 202)\">return<\/span><span> <\/span><span class=\"token\" style=\"color:rgb(255, 88, 116)\">True<\/span><span>\n<\/span><\/code><\/pre>\n<\/div>\n<h3 class=\"chakra-heading group css-xuzltg\" id=\"subgroup-membership-checks\" data-group=\"true\"><a class=\"chakra-link css-128fqrf\" aria-label=\"subgroup membership checks permalink\" href=\"#subgroup-membership-checks\"><svg viewbox=\"0 0 24 24\" focusable=\"false\" class=\"chakra-icon css-173jpr1\"><g fill=\"currentColor\"><path d=\"M10.458,18.374,7.721,21.11a2.853,2.853,0,0,1-3.942,0l-.892-.891a2.787,2.787,0,0,1,0-3.941l5.8-5.8a2.789,2.789,0,0,1,3.942,0l.893.892A1,1,0,0,0,14.94,9.952l-.893-.892a4.791,4.791,0,0,0-6.771,0l-5.8,5.8a4.787,4.787,0,0,0,0,6.77l.892.891a4.785,4.785,0,0,0,6.771,0l2.736-2.735a1,1,0,1,0-1.414-1.415Z\"\/><path d=\"M22.526,2.363l-.892-.892a4.8,4.8,0,0,0-6.77,0l-2.905,2.9a1,1,0,0,0,1.414,1.414l2.9-2.9a2.79,2.79,0,0,1,3.941,0l.893.893a2.786,2.786,0,0,1,0,3.942l-5.8,5.8a2.769,2.769,0,0,1-1.971.817h0a2.766,2.766,0,0,1-1.969-.816,1,1,0,1,0-1.415,1.412,4.751,4.751,0,0,0,3.384,1.4h0a4.752,4.752,0,0,0,3.385-1.4l5.8-5.8a4.786,4.786,0,0,0,0-6.771Z\"\/><\/g><\/svg><\/a>Subgroup membership checks<\/h3>\n<p class=\"chakra-text css-gi02ar\">As mentioned above, when working with any point of unknown origin, it is crucial to verify that it belongs to the correct subgroup, in addition to confirming that the point lies on the correct curve. For <span class=\"chakra-text css-ons8vw\">bn254<\/span>, this is only necessary for <span class=\"math math-inline\"><span class=\"katex\"><span class=\"katex-mathml\"><math xmlns=\"http:\/\/www.w3.org\/1998\/Math\/MathML\"><semantics><mrow><msub><mi>G<\/mi><mn>2<\/mn><\/msub><\/mrow><annotation encoding=\"application\/x-tex\">G_2<\/annotation><\/semantics><\/math><\/span><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"base\"><span class=\"strut\" style=\"height:0.8333em;vertical-align:-0.15em\"\/><span class=\"mord\"><span class=\"mord mathnormal\">G<\/span><span class=\"msupsub\"><span class=\"vlist-t vlist-t2\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.3011em\"><span style=\"top:-2.55em;margin-left:0em;margin-right:0.05em\"><span class=\"pstrut\" style=\"height:2.7em\"\/><span class=\"sizing reset-size6 size3 mtight\"><span class=\"mord mtight\">2<\/span><\/span><\/span><\/span><span class=\"vlist-s\">\u200b<\/span><\/span><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.15em\"><span\/><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>, because <span class=\"math math-inline\"><span class=\"katex\"><span class=\"katex-mathml\"><math xmlns=\"http:\/\/www.w3.org\/1998\/Math\/MathML\"><semantics><mrow><msub><mi>G<\/mi><mn>1<\/mn><\/msub><\/mrow><annotation encoding=\"application\/x-tex\">G_1<\/annotation><\/semantics><\/math><\/span><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"base\"><span class=\"strut\" style=\"height:0.8333em;vertical-align:-0.15em\"\/><span class=\"mord\"><span class=\"mord mathnormal\">G<\/span><span class=\"msupsub\"><span class=\"vlist-t vlist-t2\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.3011em\"><span style=\"top:-2.55em;margin-left:0em;margin-right:0.05em\"><span class=\"pstrut\" style=\"height:2.7em\"\/><span class=\"sizing reset-size6 size3 mtight\"><span class=\"mord mtight\">1<\/span><\/span><\/span><\/span><span class=\"vlist-s\">\u200b<\/span><\/span><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.15em\"><span\/><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span> is of prime order. A straightforward method to test membership in <span class=\"math math-inline\"><span class=\"katex\"><span class=\"katex-mathml\"><math xmlns=\"http:\/\/www.w3.org\/1998\/Math\/MathML\"><semantics><mrow><mi>G<\/mi><\/mrow><annotation encoding=\"application\/x-tex\">G<\/annotation><\/semantics><\/math><\/span><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"base\"><span class=\"strut\" style=\"height:0.6833em\"\/><span class=\"mord mathnormal\">G<\/span><\/span><\/span><\/span><\/span> is to multiply a point by the subgroup\u2019s prime order <span class=\"math math-inline\"><span class=\"katex\"><span class=\"katex-mathml\"><math xmlns=\"http:\/\/www.w3.org\/1998\/Math\/MathML\"><semantics><mrow><mi>n<\/mi><\/mrow><annotation encoding=\"application\/x-tex\">n<\/annotation><\/semantics><\/math><\/span><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"base\"><span class=\"strut\" style=\"height:0.4306em\"\/><span class=\"mord mathnormal\">n<\/span><\/span><\/span><\/span><\/span>; if the result is the identity element, then the point is in the subgroup.<br \/>\nHowever, this method can be costly in practice due to the large size of the prime <span class=\"math math-inline\"><span class=\"katex\"><span class=\"katex-mathml\"><math xmlns=\"http:\/\/www.w3.org\/1998\/Math\/MathML\"><semantics><mrow><mi>r<\/mi><\/mrow><annotation encoding=\"application\/x-tex\">r<\/annotation><\/semantics><\/math><\/span><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"base\"><span class=\"strut\" style=\"height:0.4306em\"\/><span class=\"mord mathnormal\" style=\"margin-right:0.02778em\">r<\/span><\/span><\/span><\/span><\/span>, especially for <span class=\"math math-inline\"><span class=\"katex\"><span class=\"katex-mathml\"><math xmlns=\"http:\/\/www.w3.org\/1998\/Math\/MathML\"><semantics><mrow><msub><mi>G<\/mi><mn>2<\/mn><\/msub><\/mrow><annotation encoding=\"application\/x-tex\">G_2<\/annotation><\/semantics><\/math><\/span><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"base\"><span class=\"strut\" style=\"height:0.8333em;vertical-align:-0.15em\"\/><span class=\"mord\"><span class=\"mord mathnormal\">G<\/span><span class=\"msupsub\"><span class=\"vlist-t vlist-t2\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.3011em\"><span style=\"top:-2.55em;margin-left:0em;margin-right:0.05em\"><span class=\"pstrut\" style=\"height:2.7em\"\/><span class=\"sizing reset-size6 size3 mtight\"><span class=\"mord mtight\">2<\/span><\/span><\/span><\/span><span class=\"vlist-s\">\u200b<\/span><\/span><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.15em\"><span\/><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>. In 2021, <a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-vezwxf\" href=\"https:\/\/eprint.iacr.org\/2021\/1130.pdf\">Scott proposed<\/a> a faster method for subgroup membership testing on BLS12 curves using an easily computable <em class=\"chakra-text css-0\">endomorphism<\/em>, making the process 2\u00d7, 4\u00d7, and 4\u00d7 quicker for different groups (<strong>this technique is the one specified in <a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-vezwxf\" href=\"https:\/\/eips.ethereum.org\/EIPS\/eip-2537\">EIP-2537<\/a> for fast subgroup checks, as detailed in <a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-vezwxf\" href=\"https:\/\/eips.ethereum.org\/assets\/eip-2537\/fast_subgroup_checks\">this document<\/a><\/strong>).<br \/>\nLater, Dai et al. <a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-vezwxf\" href=\"https:\/\/eprint.iacr.org\/2022\/348.pdf\">generalized Scott&#8217;s technique<\/a> to work for a broader range of curves, including BN curves, reducing the number of operations required for subgroup membership checks. In some cases, the process can be nearly free. Koshelev also introduced a method for non-pairing-friendly curves <a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-vezwxf\" href=\"https:\/\/eprint.iacr.org\/2022\/037.pdf\">using the Tate pairing<\/a>, which was eventually further <a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-vezwxf\" href=\"https:\/\/eprint.iacr.org\/2024\/1790.pdf\">generalized to pairing-friendly curves.<\/a><\/p>\n<h2 class=\"chakra-heading group css-1kpzc4q\" id=\"the-real-slim-shady\" data-group=\"true\"><a class=\"chakra-link css-128fqrf\" aria-label=\"the real slim shady permalink\" href=\"#the-real-slim-shady\"><svg viewbox=\"0 0 24 24\" focusable=\"false\" class=\"chakra-icon css-173jpr1\"><g fill=\"currentColor\"><path d=\"M10.458,18.374,7.721,21.11a2.853,2.853,0,0,1-3.942,0l-.892-.891a2.787,2.787,0,0,1,0-3.941l5.8-5.8a2.789,2.789,0,0,1,3.942,0l.893.892A1,1,0,0,0,14.94,9.952l-.893-.892a4.791,4.791,0,0,0-6.771,0l-5.8,5.8a4.787,4.787,0,0,0,0,6.77l.892.891a4.785,4.785,0,0,0,6.771,0l2.736-2.735a1,1,0,1,0-1.414-1.415Z\"\/><path d=\"M22.526,2.363l-.892-.892a4.8,4.8,0,0,0-6.77,0l-2.905,2.9a1,1,0,0,0,1.414,1.414l2.9-2.9a2.79,2.79,0,0,1,3.941,0l.893.893a2.786,2.786,0,0,1,0,3.942l-5.8,5.8a2.769,2.769,0,0,1-1.971.817h0a2.766,2.766,0,0,1-1.969-.816,1,1,0,1,0-1.415,1.412,4.751,4.751,0,0,0,3.384,1.4h0a4.752,4.752,0,0,0,3.385-1.4l5.8-5.8a4.786,4.786,0,0,0,0-6.771Z\"\/><\/g><\/svg><\/a>The Real Slim Shady<\/h2>\n<p class=\"chakra-text css-gi02ar\">As you can see from the timeline at the end of this post, we received a report about a bug affecting <a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-vezwxf\" href=\"https:\/\/eips.ethereum.org\/EIPS\/eip-2537\">Pectra EIP-2537<\/a> on Besu, submitted via the <a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-vezwxf\" href=\"https:\/\/cantina.xyz\/competitions\/pectra\">Pectra Audit Competition<\/a>. We&#8217;re only lightly touching on that issue here, in case the original reporter wants to cover it in more detail. <strong>This post focuses specifically on the BN254 <a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-vezwxf\" href=\"https:\/\/eips.ethereum.org\/EIPS\/eip-196\">EIP-196<\/a>\/<a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-vezwxf\" href=\"https:\/\/eips.ethereum.org\/EIPS\/eip-197\">EIP-197<\/a> vulnerability<\/strong>.<\/p>\n<p class=\"chakra-text css-gi02ar\">The original reporter observed that in Besu, the <span class=\"chakra-text css-ons8vw\">is_in_subgroup<\/span> check was performed before the <span class=\"chakra-text css-ons8vw\">is_on_curve<\/span> check. Here&#8217;s an example of what that might look like:<\/p>\n<div class=\"chakra-stack css-1jx0in4\">\n<pre><pre style=\"color:white;font-family:Consolas, Monaco, &quot;Andale Mono&quot;, &quot;Ubuntu Mono&quot;, monospace;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;font-size:1em;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none;padding:1em;margin:0.5em 0;overflow:auto;background:#011627\"><code class=\"language-python\" style=\"color:#d6deeb;font-family:Consolas, Monaco, &quot;Andale Mono&quot;, &quot;Ubuntu Mono&quot;, monospace;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;font-size:1em;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none\"><span class=\"token\" style=\"color:rgb(99, 119, 119);font-style:italic\"># Pseudocode for checking if point P is valid<\/span><span>\n<\/span><span\/><span class=\"token\" style=\"color:rgb(127, 219, 202)\">def<\/span><span> <\/span><span class=\"token\" style=\"color:rgb(130, 170, 255)\">is_valid_point<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">(<\/span><span>P<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">)<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">:<\/span><span>\n<\/span><span>    <\/span><span class=\"token\" style=\"color:rgb(127, 219, 202)\">if<\/span><span> <\/span><span class=\"token\" style=\"color:rgb(127, 219, 202)\">not<\/span><span> is_in_subgroup<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">(<\/span><span>P<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">)<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">:<\/span><span>    \n<\/span><span>        <\/span><span class=\"token\" style=\"color:rgb(127, 219, 202)\">if<\/span><span> <\/span><span class=\"token\" style=\"color:rgb(127, 219, 202)\">not<\/span><span> is_on_curve<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">(<\/span><span>P<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">)<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">:<\/span><span>\n<\/span><span>            <\/span><span class=\"token\" style=\"color:rgb(127, 219, 202)\">return<\/span><span> <\/span><span class=\"token\" style=\"color:rgb(255, 88, 116)\">False<\/span><span>  \n<\/span><span>        <\/span><span class=\"token\" style=\"color:rgb(127, 219, 202)\">return<\/span><span> <\/span><span class=\"token\" style=\"color:rgb(255, 88, 116)\">False<\/span><span>\n<\/span><span>    <\/span><span class=\"token\" style=\"color:rgb(127, 219, 202)\">return<\/span><span> <\/span><span class=\"token\" style=\"color:rgb(255, 88, 116)\">True<\/span><span>\n<\/span><\/code><\/pre>\n<\/div>\n<p class=\"chakra-text css-gi02ar\">Intrigued by the issue above on the BLS curve, we decided to take a look at the Besu code for the BN curve. To my great surprise, we found something <a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-vezwxf\" href=\"https:\/\/github.com\/hyperledger\/besu-native\/blob\/6a414b4d1299b2e4c89ba7c6c3585e14bea4e230\/gnark\/gnark-jni\/gnark-eip-196.go#L301\"><strong>like this<\/strong><\/a>:<\/p>\n<div class=\"chakra-stack css-1jx0in4\">\n<pre><pre style=\"color:white;font-family:Consolas, Monaco, &quot;Andale Mono&quot;, &quot;Ubuntu Mono&quot;, monospace;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;font-size:1em;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none;padding:1em;margin:0.5em 0;overflow:auto;background:#011627\"><code class=\"language-python\" style=\"color:#d6deeb;font-family:Consolas, Monaco, &quot;Andale Mono&quot;, &quot;Ubuntu Mono&quot;, monospace;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;font-size:1em;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none\"><span class=\"token\" style=\"color:rgb(99, 119, 119);font-style:italic\"># Pseudocode for checking if point P is valid<\/span><span>\n<\/span><span\/><span class=\"token\" style=\"color:rgb(127, 219, 202)\">def<\/span><span> <\/span><span class=\"token\" style=\"color:rgb(130, 170, 255)\">is_valid_point<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">(<\/span><span>P<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">)<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">:<\/span><span>\n<\/span><span>    <\/span><span class=\"token\" style=\"color:rgb(127, 219, 202)\">if<\/span><span> <\/span><span class=\"token\" style=\"color:rgb(127, 219, 202)\">not<\/span><span> is_in_subgroup<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">(<\/span><span>P<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">)<\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">:<\/span><span>    \n<\/span><span>        <\/span><span class=\"token\" style=\"color:rgb(127, 219, 202)\">return<\/span><span> <\/span><span class=\"token\" style=\"color:rgb(255, 88, 116)\">False<\/span><span>\n<\/span><span>    <\/span><span class=\"token\" style=\"color:rgb(127, 219, 202)\">return<\/span><span> <\/span><span class=\"token\" style=\"color:rgb(255, 88, 116)\">True<\/span><span>\n<\/span><\/code><\/pre>\n<\/div>\n<p class=\"chakra-text css-gi02ar\">Wait, what? Where is the <span class=\"chakra-text css-ons8vw\">is_on_curve<\/span> check? Exactly\u2014<strong>there isn&#8217;t one!!!<\/strong><\/p>\n<p class=\"chakra-text css-gi02ar\">Now, to potentially bypass the <span class=\"chakra-text css-ons8vw\">is_valid_point<\/span> function, all you&#8217;d need to do is provide a point <strong>that lies within the correct subgroup but isn&#8217;t actually on the curve<\/strong>.<\/p>\n<p class=\"chakra-text css-gi02ar\"><strong>But wait\u2014is that even possible?<\/strong><\/p>\n<p class=\"chakra-text css-gi02ar\">Well, yes\u2014but only for particular, well-chosen curves. Specifically, if two curves are <em class=\"chakra-text css-0\">isomorphic<\/em>, they share the same group structure, which means you could craft a point from the isomorphic curve that passes subgroup checks but doesn&#8217;t lie on the intended curve.<\/p>\n<p class=\"chakra-text css-gi02ar\">Sneaky, right?<\/p>\n<p class=\"chakra-text css-gi02ar\"><img decoding=\"async\" alt=\"\" src=\"https:\/\/notes.ethereum.org\/_uploads\/B1UvyiG0Jl.png\" class=\"chakra-image css-hw6q2r\"\/><\/p>\n<h3 class=\"chakra-heading group css-xuzltg\" id=\"did-you-say-isomorpshism\" data-group=\"true\"><a class=\"chakra-link css-128fqrf\" aria-label=\"did you say isomorpshism permalink\" href=\"#did-you-say-isomorpshism\"><svg viewbox=\"0 0 24 24\" focusable=\"false\" class=\"chakra-icon css-173jpr1\"><g fill=\"currentColor\"><path d=\"M10.458,18.374,7.721,21.11a2.853,2.853,0,0,1-3.942,0l-.892-.891a2.787,2.787,0,0,1,0-3.941l5.8-5.8a2.789,2.789,0,0,1,3.942,0l.893.892A1,1,0,0,0,14.94,9.952l-.893-.892a4.791,4.791,0,0,0-6.771,0l-5.8,5.8a4.787,4.787,0,0,0,0,6.77l.892.891a4.785,4.785,0,0,0,6.771,0l2.736-2.735a1,1,0,1,0-1.414-1.415Z\"\/><path d=\"M22.526,2.363l-.892-.892a4.8,4.8,0,0,0-6.77,0l-2.905,2.9a1,1,0,0,0,1.414,1.414l2.9-2.9a2.79,2.79,0,0,1,3.941,0l.893.893a2.786,2.786,0,0,1,0,3.942l-5.8,5.8a2.769,2.769,0,0,1-1.971.817h0a2.766,2.766,0,0,1-1.969-.816,1,1,0,1,0-1.415,1.412,4.751,4.751,0,0,0,3.384,1.4h0a4.752,4.752,0,0,0,3.385-1.4l5.8-5.8a4.786,4.786,0,0,0,0-6.771Z\"\/><\/g><\/svg><\/a>Did you say isomorpshism?<\/h3>\n<p class=\"chakra-text css-gi02ar\"><em class=\"chakra-text css-0\">Feel free to skip this section if you&#8217;re not interested in the details\u2014we&#8217;re about to go a bit deeper into the math.<\/em><\/p>\n<p class=\"chakra-text css-gi02ar\">Let <span class=\"math math-inline\"><span class=\"katex\"><span class=\"katex-mathml\"><math xmlns=\"http:\/\/www.w3.org\/1998\/Math\/MathML\"><semantics><mrow><msub><mi mathvariant=\"double-struck\">F<\/mi><mi>q<\/mi><\/msub><\/mrow><annotation encoding=\"application\/x-tex\">\\mathbb{F}_q<\/annotation><\/semantics><\/math><\/span><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"base\"><span class=\"strut\" style=\"height:0.975em;vertical-align:-0.2861em\"\/><span class=\"mord\"><span class=\"mord mathbb\">F<\/span><span class=\"msupsub\"><span class=\"vlist-t vlist-t2\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.1514em\"><span style=\"top:-2.55em;margin-left:0em;margin-right:0.05em\"><span class=\"pstrut\" style=\"height:2.7em\"\/><span class=\"sizing reset-size6 size3 mtight\"><span class=\"mord mathnormal mtight\" style=\"margin-right:0.03588em\">q<\/span><\/span><\/span><\/span><span class=\"vlist-s\">\u200b<\/span><\/span><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.2861em\"><span\/><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span> be a finite field with characteristic different from 2 and 3, meaning <span class=\"math math-inline\"><span class=\"katex\"><span class=\"katex-mathml\"><math xmlns=\"http:\/\/www.w3.org\/1998\/Math\/MathML\"><semantics><mrow><mi>q<\/mi><mo>=<\/mo><msup><mi>p<\/mi><mi>f<\/mi><\/msup><\/mrow><annotation encoding=\"application\/x-tex\">q = p^f<\/annotation><\/semantics><\/math><\/span><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"base\"><span class=\"strut\" style=\"height:0.625em;vertical-align:-0.1944em\"\/><span class=\"mord mathnormal\" style=\"margin-right:0.03588em\">q<\/span><span class=\"mspace\" style=\"margin-right:0.2778em\"\/><span class=\"mrel\">=<\/span><span class=\"mspace\" style=\"margin-right:0.2778em\"\/><\/span><span class=\"base\"><span class=\"strut\" style=\"height:1.0435em;vertical-align:-0.1944em\"\/><span class=\"mord\"><span class=\"mord mathnormal\">p<\/span><span class=\"msupsub\"><span class=\"vlist-t\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.8491em\"><span style=\"top:-3.063em;margin-right:0.05em\"><span class=\"pstrut\" style=\"height:2.7em\"\/><span class=\"sizing reset-size6 size3 mtight\"><span class=\"mord mathnormal mtight\" style=\"margin-right:0.10764em\">f<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span> for some prime <span class=\"math math-inline\"><span class=\"katex\"><span class=\"katex-mathml\"><math xmlns=\"http:\/\/www.w3.org\/1998\/Math\/MathML\"><semantics><mrow><mi>p<\/mi><mo>\u2265<\/mo><mn>5<\/mn><\/mrow><annotation encoding=\"application\/x-tex\">p \\geq 5<\/annotation><\/semantics><\/math><\/span><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"base\"><span class=\"strut\" style=\"height:0.8304em;vertical-align:-0.1944em\"\/><span class=\"mord mathnormal\">p<\/span><span class=\"mspace\" style=\"margin-right:0.2778em\"\/><span class=\"mrel\">\u2265<\/span><span class=\"mspace\" style=\"margin-right:0.2778em\"\/><\/span><span class=\"base\"><span class=\"strut\" style=\"height:0.6444em\"\/><span class=\"mord\">5<\/span><\/span><\/span><\/span><\/span> and integer <span class=\"math math-inline\"><span class=\"katex\"><span class=\"katex-mathml\"><math xmlns=\"http:\/\/www.w3.org\/1998\/Math\/MathML\"><semantics><mrow><mi>f<\/mi><mo>\u2265<\/mo><mn>1<\/mn><\/mrow><annotation encoding=\"application\/x-tex\">f \\geq 1<\/annotation><\/semantics><\/math><\/span><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"base\"><span class=\"strut\" style=\"height:0.8889em;vertical-align:-0.1944em\"\/><span class=\"mord mathnormal\" style=\"margin-right:0.10764em\">f<\/span><span class=\"mspace\" style=\"margin-right:0.2778em\"\/><span class=\"mrel\">\u2265<\/span><span class=\"mspace\" style=\"margin-right:0.2778em\"\/><\/span><span class=\"base\"><span class=\"strut\" style=\"height:0.6444em\"\/><span class=\"mord\">1<\/span><\/span><\/span><\/span><\/span>. We consider elliptic curves <span class=\"math math-inline\"><span class=\"katex\"><span class=\"katex-mathml\"><math xmlns=\"http:\/\/www.w3.org\/1998\/Math\/MathML\"><semantics><mrow><mi>E<\/mi><\/mrow><annotation encoding=\"application\/x-tex\">E<\/annotation><\/semantics><\/math><\/span><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"base\"><span class=\"strut\" style=\"height:0.6833em\"\/><span class=\"mord mathnormal\" style=\"margin-right:0.05764em\">E<\/span><\/span><\/span><\/span><\/span> over <span class=\"math math-inline\"><span class=\"katex\"><span class=\"katex-mathml\"><math xmlns=\"http:\/\/www.w3.org\/1998\/Math\/MathML\"><semantics><mrow><msub><mi mathvariant=\"double-struck\">F<\/mi><mi>q<\/mi><\/msub><\/mrow><annotation encoding=\"application\/x-tex\">\\mathbb{F}_q<\/annotation><\/semantics><\/math><\/span><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"base\"><span class=\"strut\" style=\"height:0.975em;vertical-align:-0.2861em\"\/><span class=\"mord\"><span class=\"mord mathbb\">F<\/span><span class=\"msupsub\"><span class=\"vlist-t vlist-t2\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.1514em\"><span style=\"top:-2.55em;margin-left:0em;margin-right:0.05em\"><span class=\"pstrut\" style=\"height:2.7em\"\/><span class=\"sizing reset-size6 size3 mtight\"><span class=\"mord mathnormal mtight\" style=\"margin-right:0.03588em\">q<\/span><\/span><\/span><\/span><span class=\"vlist-s\">\u200b<\/span><\/span><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.2861em\"><span\/><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span> given by the short Weierstra\u00df equation:<\/p>\n<div class=\"math math-display\"><span class=\"katex-display\"><span class=\"katex\"><span class=\"katex-mathml\"><math xmlns=\"http:\/\/www.w3.org\/1998\/Math\/MathML\" display=\"block\"><semantics><mrow><msup><mi>y<\/mi><mn>2<\/mn><\/msup><mo>=<\/mo><msup><mi>x<\/mi><mn>3<\/mn><\/msup><mo>+<\/mo><mi>A<\/mi><mi>x<\/mi><mo>+<\/mo><mi>B<\/mi><\/mrow><annotation encoding=\"application\/x-tex\">y^2 = x^3 + A x + B   <\/annotation><\/semantics><\/math><\/span><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"base\"><span class=\"strut\" style=\"height:1.0585em;vertical-align:-0.1944em\"\/><span class=\"mord\"><span class=\"mord mathnormal\" style=\"margin-right:0.03588em\">y<\/span><span class=\"msupsub\"><span class=\"vlist-t\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.8641em\"><span style=\"top:-3.113em;margin-right:0.05em\"><span class=\"pstrut\" style=\"height:2.7em\"\/><span class=\"sizing reset-size6 size3 mtight\"><span class=\"mord mtight\">2<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><span class=\"mspace\" style=\"margin-right:0.2778em\"\/><span class=\"mrel\">=<\/span><span class=\"mspace\" style=\"margin-right:0.2778em\"\/><\/span><span class=\"base\"><span class=\"strut\" style=\"height:0.9474em;vertical-align:-0.0833em\"\/><span class=\"mord\"><span class=\"mord mathnormal\">x<\/span><span class=\"msupsub\"><span class=\"vlist-t\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.8641em\"><span style=\"top:-3.113em;margin-right:0.05em\"><span class=\"pstrut\" style=\"height:2.7em\"\/><span class=\"sizing reset-size6 size3 mtight\"><span class=\"mord mtight\">3<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><span class=\"mspace\" style=\"margin-right:0.2222em\"\/><span class=\"mbin\">+<\/span><span class=\"mspace\" style=\"margin-right:0.2222em\"\/><\/span><span class=\"base\"><span class=\"strut\" style=\"height:0.7667em;vertical-align:-0.0833em\"\/><span class=\"mord mathnormal\">A<\/span><span class=\"mord mathnormal\">x<\/span><span class=\"mspace\" style=\"margin-right:0.2222em\"\/><span class=\"mbin\">+<\/span><span class=\"mspace\" style=\"margin-right:0.2222em\"\/><\/span><span class=\"base\"><span class=\"strut\" style=\"height:0.6833em\"\/><span class=\"mord mathnormal\" style=\"margin-right:0.05017em\">B<\/span><\/span><\/span><\/span><\/span><\/div>\n<p class=\"chakra-text css-gi02ar\">where <span class=\"math math-inline\"><span class=\"katex\"><span class=\"katex-mathml\"><math xmlns=\"http:\/\/www.w3.org\/1998\/Math\/MathML\"><semantics><mrow><mi>A<\/mi><\/mrow><annotation encoding=\"application\/x-tex\">A<\/annotation><\/semantics><\/math><\/span><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"base\"><span class=\"strut\" style=\"height:0.6833em\"\/><span class=\"mord mathnormal\">A<\/span><\/span><\/span><\/span><\/span> and <span class=\"math math-inline\"><span class=\"katex\"><span class=\"katex-mathml\"><math xmlns=\"http:\/\/www.w3.org\/1998\/Math\/MathML\"><semantics><mrow><mi>B<\/mi><\/mrow><annotation encoding=\"application\/x-tex\">B<\/annotation><\/semantics><\/math><\/span><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"base\"><span class=\"strut\" style=\"height:0.6833em\"\/><span class=\"mord mathnormal\" style=\"margin-right:0.05017em\">B<\/span><\/span><\/span><\/span><\/span> are constants satisfying <span class=\"math math-inline\"><span class=\"katex\"><span class=\"katex-mathml\"><math xmlns=\"http:\/\/www.w3.org\/1998\/Math\/MathML\"><semantics><mrow><mn>4<\/mn><msup><mi>A<\/mi><mn>3<\/mn><\/msup><mo>+<\/mo><mn>27<\/mn><msup><mi>B<\/mi><mn>2<\/mn><\/msup><mo mathvariant=\"normal\">\u2260<\/mo><mn>0<\/mn><\/mrow><annotation encoding=\"application\/x-tex\">4A^3 + 27B^2 \\neq 0<\/annotation><\/semantics><\/math><\/span><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"base\"><span class=\"strut\" style=\"height:0.8974em;vertical-align:-0.0833em\"\/><span class=\"mord\">4<\/span><span class=\"mord\"><span class=\"mord mathnormal\">A<\/span><span class=\"msupsub\"><span class=\"vlist-t\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.8141em\"><span style=\"top:-3.063em;margin-right:0.05em\"><span class=\"pstrut\" style=\"height:2.7em\"\/><span class=\"sizing reset-size6 size3 mtight\"><span class=\"mord mtight\">3<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><span class=\"mspace\" style=\"margin-right:0.2222em\"\/><span class=\"mbin\">+<\/span><span class=\"mspace\" style=\"margin-right:0.2222em\"\/><\/span><span class=\"base\"><span class=\"strut\" style=\"height:1.0085em;vertical-align:-0.1944em\"\/><span class=\"mord\">27<\/span><span class=\"mord\"><span class=\"mord mathnormal\" style=\"margin-right:0.05017em\">B<\/span><span class=\"msupsub\"><span class=\"vlist-t\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.8141em\"><span style=\"top:-3.063em;margin-right:0.05em\"><span class=\"pstrut\" style=\"height:2.7em\"\/><span class=\"sizing reset-size6 size3 mtight\"><span class=\"mord mtight\">2<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><span class=\"mspace\" style=\"margin-right:0.2778em\"\/><span class=\"mrel\"><span class=\"mrel\"><span class=\"mord vbox\"><span class=\"thinbox\"><span class=\"rlap\"><span class=\"strut\" style=\"height:0.8889em;vertical-align:-0.1944em\"\/><span class=\"inner\"><span class=\"mord\"><span class=\"mrel\">\ue020<\/span><\/span><\/span><span class=\"fix\"\/><\/span><\/span><\/span><\/span><span class=\"mrel\">=<\/span><\/span><span class=\"mspace\" style=\"margin-right:0.2778em\"\/><\/span><span class=\"base\"><span class=\"strut\" style=\"height:0.6444em\"\/><span class=\"mord\">0<\/span><\/span><\/span><\/span><\/span>.^[This condition ensures the curve is <strong>non-singular<\/strong>; if it were violated, the equation would define a singular point lacking a well-defined tangent, making it impossible to perform meaningful self-addition. In such cases, the object is not technically an elliptic curve.]<\/p>\n<h4 class=\"chakra-heading group css-qm6a1\" id=\"curve-isomorphisms\" data-group=\"true\"><a class=\"chakra-link css-128fqrf\" aria-label=\"curve isomorphisms permalink\" href=\"#curve-isomorphisms\"><svg viewbox=\"0 0 24 24\" focusable=\"false\" class=\"chakra-icon css-173jpr1\"><g fill=\"currentColor\"><path d=\"M10.458,18.374,7.721,21.11a2.853,2.853,0,0,1-3.942,0l-.892-.891a2.787,2.787,0,0,1,0-3.941l5.8-5.8a2.789,2.789,0,0,1,3.942,0l.893.892A1,1,0,0,0,14.94,9.952l-.893-.892a4.791,4.791,0,0,0-6.771,0l-5.8,5.8a4.787,4.787,0,0,0,0,6.77l.892.891a4.785,4.785,0,0,0,6.771,0l2.736-2.735a1,1,0,1,0-1.414-1.415Z\"\/><path d=\"M22.526,2.363l-.892-.892a4.8,4.8,0,0,0-6.77,0l-2.905,2.9a1,1,0,0,0,1.414,1.414l2.9-2.9a2.79,2.79,0,0,1,3.941,0l.893.893a2.786,2.786,0,0,1,0,3.942l-5.8,5.8a2.769,2.769,0,0,1-1.971.817h0a2.766,2.766,0,0,1-1.969-.816,1,1,0,1,0-1.415,1.412,4.751,4.751,0,0,0,3.384,1.4h0a4.752,4.752,0,0,0,3.385-1.4l5.8-5.8a4.786,4.786,0,0,0,0-6.771Z\"\/><\/g><\/svg><\/a>Curve Isomorphisms<\/h4>\n<p class=\"chakra-text css-gi02ar\">Two elliptic curves are considered <strong>isomorphic<\/strong>^[To exploit the vulnerabilities described here, we really want <strong>isomorphic<\/strong> curves, not just <strong>isogenous<\/strong> curves.] if they can be related by an affine change of variables. Such transformations preserve the group structure and ensure that point addition remains consistent. It can be shown that the only possible transformations between two curves in short Weierstra\u00df form take the shape:<\/p>\n<div class=\"math math-display\"><span class=\"katex-display\"><span class=\"katex\"><span class=\"katex-mathml\"><math xmlns=\"http:\/\/www.w3.org\/1998\/Math\/MathML\" display=\"block\"><semantics><mrow><mo stretchy=\"false\">(<\/mo><mi>x<\/mi><mo separator=\"true\">,<\/mo><mi>y<\/mi><mo stretchy=\"false\">)<\/mo><mo>\u21a6<\/mo><mo stretchy=\"false\">(<\/mo><msup><mi>e<\/mi><mn>2<\/mn><\/msup><mi>x<\/mi><mo separator=\"true\">,<\/mo><msup><mi>e<\/mi><mn>3<\/mn><\/msup><mi>y<\/mi><mo stretchy=\"false\">)<\/mo><\/mrow><annotation encoding=\"application\/x-tex\">(x, y) \\mapsto (e^2 x, e^3 y)<\/annotation><\/semantics><\/math><\/span><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"base\"><span class=\"strut\" style=\"height:1em;vertical-align:-0.25em\"\/><span class=\"mopen\">(<\/span><span class=\"mord mathnormal\">x<\/span><span class=\"mpunct\">,<\/span><span class=\"mspace\" style=\"margin-right:0.1667em\"\/><span class=\"mord mathnormal\" style=\"margin-right:0.03588em\">y<\/span><span class=\"mclose\">)<\/span><span class=\"mspace\" style=\"margin-right:0.2778em\"\/><span class=\"mrel\">\u21a6<\/span><span class=\"mspace\" style=\"margin-right:0.2778em\"\/><\/span><span class=\"base\"><span class=\"strut\" style=\"height:1.1141em;vertical-align:-0.25em\"\/><span class=\"mopen\">(<\/span><span class=\"mord\"><span class=\"mord mathnormal\">e<\/span><span class=\"msupsub\"><span class=\"vlist-t\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.8641em\"><span style=\"top:-3.113em;margin-right:0.05em\"><span class=\"pstrut\" style=\"height:2.7em\"\/><span class=\"sizing reset-size6 size3 mtight\"><span class=\"mord mtight\">2<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><span class=\"mord mathnormal\">x<\/span><span class=\"mpunct\">,<\/span><span class=\"mspace\" style=\"margin-right:0.1667em\"\/><span class=\"mord\"><span class=\"mord mathnormal\">e<\/span><span class=\"msupsub\"><span class=\"vlist-t\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.8641em\"><span style=\"top:-3.113em;margin-right:0.05em\"><span class=\"pstrut\" style=\"height:2.7em\"\/><span class=\"sizing reset-size6 size3 mtight\"><span class=\"mord mtight\">3<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><span class=\"mord mathnormal\" style=\"margin-right:0.03588em\">y<\/span><span class=\"mclose\">)<\/span><\/span><\/span><\/span><\/span><\/div>\n<p class=\"chakra-text css-gi02ar\">for some nonzero <span class=\"math math-inline\"><span class=\"katex\"><span class=\"katex-mathml\"><math xmlns=\"http:\/\/www.w3.org\/1998\/Math\/MathML\"><semantics><mrow><mi>e<\/mi><mo>\u2208<\/mo><msub><mi mathvariant=\"double-struck\">F<\/mi><mi>q<\/mi><\/msub><\/mrow><annotation encoding=\"application\/x-tex\">e \\in \\mathbb{F}_q<\/annotation><\/semantics><\/math><\/span><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"base\"><span class=\"strut\" style=\"height:0.5782em;vertical-align:-0.0391em\"\/><span class=\"mord mathnormal\">e<\/span><span class=\"mspace\" style=\"margin-right:0.2778em\"\/><span class=\"mrel\">\u2208<\/span><span class=\"mspace\" style=\"margin-right:0.2778em\"\/><\/span><span class=\"base\"><span class=\"strut\" style=\"height:0.975em;vertical-align:-0.2861em\"\/><span class=\"mord\"><span class=\"mord mathbb\">F<\/span><span class=\"msupsub\"><span class=\"vlist-t vlist-t2\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.1514em\"><span style=\"top:-2.55em;margin-left:0em;margin-right:0.05em\"><span class=\"pstrut\" style=\"height:2.7em\"\/><span class=\"sizing reset-size6 size3 mtight\"><span class=\"mord mathnormal mtight\" style=\"margin-right:0.03588em\">q<\/span><\/span><\/span><\/span><span class=\"vlist-s\">\u200b<\/span><\/span><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.2861em\"><span\/><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>. Applying this transformation to the curve equation results in:<\/p>\n<div class=\"math math-display\"><span class=\"katex-display\"><span class=\"katex\"><span class=\"katex-mathml\"><math xmlns=\"http:\/\/www.w3.org\/1998\/Math\/MathML\" display=\"block\"><semantics><mrow><msup><mi>y<\/mi><mn>2<\/mn><\/msup><mo>=<\/mo><msup><mi>x<\/mi><mn>3<\/mn><\/msup><mo>+<\/mo><mi>A<\/mi><msup><mi>e<\/mi><mn>4<\/mn><\/msup><mi>x<\/mi><mo>+<\/mo><mi>B<\/mi><msup><mi>e<\/mi><mn>6<\/mn><\/msup><\/mrow><annotation encoding=\"application\/x-tex\">y^2 = x^3 + A e^{4} x + B e^{6}<\/annotation><\/semantics><\/math><\/span><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"base\"><span class=\"strut\" style=\"height:1.0585em;vertical-align:-0.1944em\"\/><span class=\"mord\"><span class=\"mord mathnormal\" style=\"margin-right:0.03588em\">y<\/span><span class=\"msupsub\"><span class=\"vlist-t\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.8641em\"><span style=\"top:-3.113em;margin-right:0.05em\"><span class=\"pstrut\" style=\"height:2.7em\"\/><span class=\"sizing reset-size6 size3 mtight\"><span class=\"mord mtight\">2<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><span class=\"mspace\" style=\"margin-right:0.2778em\"\/><span class=\"mrel\">=<\/span><span class=\"mspace\" style=\"margin-right:0.2778em\"\/><\/span><span class=\"base\"><span class=\"strut\" style=\"height:0.9474em;vertical-align:-0.0833em\"\/><span class=\"mord\"><span class=\"mord mathnormal\">x<\/span><span class=\"msupsub\"><span class=\"vlist-t\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.8641em\"><span style=\"top:-3.113em;margin-right:0.05em\"><span class=\"pstrut\" style=\"height:2.7em\"\/><span class=\"sizing reset-size6 size3 mtight\"><span class=\"mord mtight\">3<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><span class=\"mspace\" style=\"margin-right:0.2222em\"\/><span class=\"mbin\">+<\/span><span class=\"mspace\" style=\"margin-right:0.2222em\"\/><\/span><span class=\"base\"><span class=\"strut\" style=\"height:0.9474em;vertical-align:-0.0833em\"\/><span class=\"mord mathnormal\">A<\/span><span class=\"mord\"><span class=\"mord mathnormal\">e<\/span><span class=\"msupsub\"><span class=\"vlist-t\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.8641em\"><span style=\"top:-3.113em;margin-right:0.05em\"><span class=\"pstrut\" style=\"height:2.7em\"\/><span class=\"sizing reset-size6 size3 mtight\"><span class=\"mord mtight\"><span class=\"mord mtight\">4<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><span class=\"mord mathnormal\">x<\/span><span class=\"mspace\" style=\"margin-right:0.2222em\"\/><span class=\"mbin\">+<\/span><span class=\"mspace\" style=\"margin-right:0.2222em\"\/><\/span><span class=\"base\"><span class=\"strut\" style=\"height:0.8641em\"\/><span class=\"mord mathnormal\" style=\"margin-right:0.05017em\">B<\/span><span class=\"mord\"><span class=\"mord mathnormal\">e<\/span><span class=\"msupsub\"><span class=\"vlist-t\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.8641em\"><span style=\"top:-3.113em;margin-right:0.05em\"><span class=\"pstrut\" style=\"height:2.7em\"\/><span class=\"sizing reset-size6 size3 mtight\"><span class=\"mord mtight\"><span class=\"mord mtight\">6<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/div>\n<p class=\"chakra-text css-gi02ar\">The <strong><span class=\"math math-inline\"><span class=\"katex\"><span class=\"katex-mathml\"><math xmlns=\"http:\/\/www.w3.org\/1998\/Math\/MathML\"><semantics><mrow><mi>j<\/mi><\/mrow><annotation encoding=\"application\/x-tex\">j<\/annotation><\/semantics><\/math><\/span><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"base\"><span class=\"strut\" style=\"height:0.854em;vertical-align:-0.1944em\"\/><span class=\"mord mathnormal\" style=\"margin-right:0.05724em\">j<\/span><\/span><\/span><\/span><\/span>-invariant<\/strong> of a curve is defined as:<\/p>\n<div class=\"math math-display\"><span class=\"katex-display\"><span class=\"katex\"><span class=\"katex-mathml\"><math xmlns=\"http:\/\/www.w3.org\/1998\/Math\/MathML\" display=\"block\"><semantics><mrow><mi>j<\/mi><mo>=<\/mo><mn>1728<\/mn><mfrac><mrow><mn>4<\/mn><msup><mi>A<\/mi><mn>3<\/mn><\/msup><\/mrow><mrow><mn>4<\/mn><msup><mi>A<\/mi><mn>3<\/mn><\/msup><mo>+<\/mo><mn>27<\/mn><msup><mi>B<\/mi><mn>2<\/mn><\/msup><\/mrow><\/mfrac><\/mrow><annotation encoding=\"application\/x-tex\">j = 1728 \\frac{4A^3}{4A^3 + 27B^2}<\/annotation><\/semantics><\/math><\/span><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"base\"><span class=\"strut\" style=\"height:0.854em;vertical-align:-0.1944em\"\/><span class=\"mord mathnormal\" style=\"margin-right:0.05724em\">j<\/span><span class=\"mspace\" style=\"margin-right:0.2778em\"\/><span class=\"mrel\">=<\/span><span class=\"mspace\" style=\"margin-right:0.2778em\"\/><\/span><span class=\"base\"><span class=\"strut\" style=\"height:2.2604em;vertical-align:-0.7693em\"\/><span class=\"mord\">1728<\/span><span class=\"mord\"><span class=\"mopen nulldelimiter\"\/><span class=\"mfrac\"><span class=\"vlist-t vlist-t2\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:1.4911em\"><span style=\"top:-2.314em\"><span class=\"pstrut\" style=\"height:3em\"\/><span class=\"mord\"><span class=\"mord\">4<\/span><span class=\"mord\"><span class=\"mord mathnormal\">A<\/span><span class=\"msupsub\"><span class=\"vlist-t\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.7401em\"><span style=\"top:-2.989em;margin-right:0.05em\"><span class=\"pstrut\" style=\"height:2.7em\"\/><span class=\"sizing reset-size6 size3 mtight\"><span class=\"mord mtight\">3<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><span class=\"mspace\" style=\"margin-right:0.2222em\"\/><span class=\"mbin\">+<\/span><span class=\"mspace\" style=\"margin-right:0.2222em\"\/><span class=\"mord\">27<\/span><span class=\"mord\"><span class=\"mord mathnormal\" style=\"margin-right:0.05017em\">B<\/span><span class=\"msupsub\"><span class=\"vlist-t\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.7401em\"><span style=\"top:-2.989em;margin-right:0.05em\"><span class=\"pstrut\" style=\"height:2.7em\"\/><span class=\"sizing reset-size6 size3 mtight\"><span class=\"mord mtight\">2<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><span style=\"top:-3.23em\"><span class=\"pstrut\" style=\"height:3em\"\/><span class=\"frac-line\" style=\"border-bottom-width:0.04em\"\/><\/span><span style=\"top:-3.677em\"><span class=\"pstrut\" style=\"height:3em\"\/><span class=\"mord\"><span class=\"mord\">4<\/span><span class=\"mord\"><span class=\"mord mathnormal\">A<\/span><span class=\"msupsub\"><span class=\"vlist-t\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.8141em\"><span style=\"top:-3.063em;margin-right:0.05em\"><span class=\"pstrut\" style=\"height:2.7em\"\/><span class=\"sizing reset-size6 size3 mtight\"><span class=\"mord mtight\">3<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><span class=\"vlist-s\">\u200b<\/span><\/span><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.7693em\"><span\/><\/span><\/span><\/span><\/span><span class=\"mclose nulldelimiter\"\/><\/span><\/span><\/span><\/span><\/span><\/div>\n<p class=\"chakra-text css-gi02ar\">Every element of <span class=\"math math-inline\"><span class=\"katex\"><span class=\"katex-mathml\"><math xmlns=\"http:\/\/www.w3.org\/1998\/Math\/MathML\"><semantics><mrow><msub><mi mathvariant=\"double-struck\">F<\/mi><mi>q<\/mi><\/msub><\/mrow><annotation encoding=\"application\/x-tex\">\\mathbb{F}_q<\/annotation><\/semantics><\/math><\/span><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"base\"><span class=\"strut\" style=\"height:0.975em;vertical-align:-0.2861em\"\/><span class=\"mord\"><span class=\"mord mathbb\">F<\/span><span class=\"msupsub\"><span class=\"vlist-t vlist-t2\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.1514em\"><span style=\"top:-2.55em;margin-left:0em;margin-right:0.05em\"><span class=\"pstrut\" style=\"height:2.7em\"\/><span class=\"sizing reset-size6 size3 mtight\"><span class=\"mord mathnormal mtight\" style=\"margin-right:0.03588em\">q<\/span><\/span><\/span><\/span><span class=\"vlist-s\">\u200b<\/span><\/span><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.2861em\"><span\/><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span> can be a possible <span class=\"math math-inline\"><span class=\"katex\"><span class=\"katex-mathml\"><math xmlns=\"http:\/\/www.w3.org\/1998\/Math\/MathML\"><semantics><mrow><mi>j<\/mi><\/mrow><annotation encoding=\"application\/x-tex\">j<\/annotation><\/semantics><\/math><\/span><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"base\"><span class=\"strut\" style=\"height:0.854em;vertical-align:-0.1944em\"\/><span class=\"mord mathnormal\" style=\"margin-right:0.05724em\">j<\/span><\/span><\/span><\/span><\/span>-invariant.^[Both BLS and BN curves have a j-invariant equal to 0, which is <strong>really special<\/strong>.] When two elliptic curves share the same <span class=\"math math-inline\"><span class=\"katex\"><span class=\"katex-mathml\"><math xmlns=\"http:\/\/www.w3.org\/1998\/Math\/MathML\"><semantics><mrow><mi>j<\/mi><\/mrow><annotation encoding=\"application\/x-tex\">j<\/annotation><\/semantics><\/math><\/span><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"base\"><span class=\"strut\" style=\"height:0.854em;vertical-align:-0.1944em\"\/><span class=\"mord mathnormal\" style=\"margin-right:0.05724em\">j<\/span><\/span><\/span><\/span><\/span>-invariant, they are either <strong>isomorphic<\/strong> (in the sense described above) or they are <strong>twists<\/strong> of each other.^[We omit the discussion about twists here, as they are not relevant to this case.]<\/p>\n<h2 class=\"chakra-heading group css-1kpzc4q\" id=\"exploitability\" data-group=\"true\"><a class=\"chakra-link css-128fqrf\" aria-label=\"exploitability permalink\" href=\"#exploitability\"><svg viewbox=\"0 0 24 24\" focusable=\"false\" class=\"chakra-icon css-173jpr1\"><g fill=\"currentColor\"><path d=\"M10.458,18.374,7.721,21.11a2.853,2.853,0,0,1-3.942,0l-.892-.891a2.787,2.787,0,0,1,0-3.941l5.8-5.8a2.789,2.789,0,0,1,3.942,0l.893.892A1,1,0,0,0,14.94,9.952l-.893-.892a4.791,4.791,0,0,0-6.771,0l-5.8,5.8a4.787,4.787,0,0,0,0,6.77l.892.891a4.785,4.785,0,0,0,6.771,0l2.736-2.735a1,1,0,1,0-1.414-1.415Z\"\/><path d=\"M22.526,2.363l-.892-.892a4.8,4.8,0,0,0-6.77,0l-2.905,2.9a1,1,0,0,0,1.414,1.414l2.9-2.9a2.79,2.79,0,0,1,3.941,0l.893.893a2.786,2.786,0,0,1,0,3.942l-5.8,5.8a2.769,2.769,0,0,1-1.971.817h0a2.766,2.766,0,0,1-1.969-.816,1,1,0,1,0-1.415,1.412,4.751,4.751,0,0,0,3.384,1.4h0a4.752,4.752,0,0,0,3.385-1.4l5.8-5.8a4.786,4.786,0,0,0,0-6.771Z\"\/><\/g><\/svg><\/a>Exploitability<\/h2>\n<p class=\"chakra-text css-gi02ar\">At this point, all that&#8217;s left is to craft a suitable point on a carefully chosen curve, and voil\u00e0\u2014<em class=\"chakra-text css-0\">le jeu est fait<\/em>.<\/p>\n<p class=\"chakra-text css-gi02ar\">You can try the test vector using <a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-vezwxf\" href=\"https:\/\/github.com\/hyperledger\/besu-native\/blob\/main\/gnark\/src\/test\/resources\/org\/hyperledger\/besu\/nativelib\/gnark\/eip196_pairing.csv#L16\">this link<\/a> and enjoy the ride.<\/p>\n<h2 class=\"chakra-heading group css-1kpzc4q\" id=\"conclusion\" data-group=\"true\"><a class=\"chakra-link css-128fqrf\" aria-label=\"conclusion permalink\" href=\"#conclusion\"><svg viewbox=\"0 0 24 24\" focusable=\"false\" class=\"chakra-icon css-173jpr1\"><g fill=\"currentColor\"><path d=\"M10.458,18.374,7.721,21.11a2.853,2.853,0,0,1-3.942,0l-.892-.891a2.787,2.787,0,0,1,0-3.941l5.8-5.8a2.789,2.789,0,0,1,3.942,0l.893.892A1,1,0,0,0,14.94,9.952l-.893-.892a4.791,4.791,0,0,0-6.771,0l-5.8,5.8a4.787,4.787,0,0,0,0,6.77l.892.891a4.785,4.785,0,0,0,6.771,0l2.736-2.735a1,1,0,1,0-1.414-1.415Z\"\/><path d=\"M22.526,2.363l-.892-.892a4.8,4.8,0,0,0-6.77,0l-2.905,2.9a1,1,0,0,0,1.414,1.414l2.9-2.9a2.79,2.79,0,0,1,3.941,0l.893.893a2.786,2.786,0,0,1,0,3.942l-5.8,5.8a2.769,2.769,0,0,1-1.971.817h0a2.766,2.766,0,0,1-1.969-.816,1,1,0,1,0-1.415,1.412,4.751,4.751,0,0,0,3.384,1.4h0a4.752,4.752,0,0,0,3.385-1.4l5.8-5.8a4.786,4.786,0,0,0,0-6.771Z\"\/><\/g><\/svg><\/a>Conclusion<\/h2>\n<p class=\"chakra-text css-gi02ar\">In this post, we explored the vulnerability in Besu&#8217;s implementation of elliptic curve checks. This flaw, if exploited, could allow an attacker to craft a point that passes subgroup membership checks but does not lie on the actual curve. The Besu team has since addressed this issue in release 25.3.0. While the issue was isolated to Besu and did not affect other clients, discrepancies like this raise important concerns for multi-client ecosystems like Ethereum. A mismatch in cryptographic checks between clients can result in divergent behavior\u2014where one client accepts a transaction or block that another rejects. This kind of inconsistency can jeopardize consensus and undermine trust in the network\u2019s uniformity, especially when subtle bugs remain unnoticed across implementations. This incident highlights why rigorous testing and robust security practices are absolutely essential\u2014especially in blockchain systems, where even minor cryptographic missteps can ripple out into major systemic vulnerabilities. Initiatives like the Pectra audit competition play a crucial role in proactively surfacing these issues before they reach production. By encouraging diverse eyes to scrutinize the code, such efforts strengthen the overall resilience of the ecosystem.<\/p>\n<h2 class=\"chakra-heading group css-1kpzc4q\" id=\"timeline\" data-group=\"true\"><a class=\"chakra-link css-128fqrf\" aria-label=\"timeline permalink\" href=\"#timeline\"><svg viewbox=\"0 0 24 24\" focusable=\"false\" class=\"chakra-icon css-173jpr1\"><g fill=\"currentColor\"><path d=\"M10.458,18.374,7.721,21.11a2.853,2.853,0,0,1-3.942,0l-.892-.891a2.787,2.787,0,0,1,0-3.941l5.8-5.8a2.789,2.789,0,0,1,3.942,0l.893.892A1,1,0,0,0,14.94,9.952l-.893-.892a4.791,4.791,0,0,0-6.771,0l-5.8,5.8a4.787,4.787,0,0,0,0,6.77l.892.891a4.785,4.785,0,0,0,6.771,0l2.736-2.735a1,1,0,1,0-1.414-1.415Z\"\/><path d=\"M22.526,2.363l-.892-.892a4.8,4.8,0,0,0-6.77,0l-2.905,2.9a1,1,0,0,0,1.414,1.414l2.9-2.9a2.79,2.79,0,0,1,3.941,0l.893.893a2.786,2.786,0,0,1,0,3.942l-5.8,5.8a2.769,2.769,0,0,1-1.971.817h0a2.766,2.766,0,0,1-1.969-.816,1,1,0,1,0-1.415,1.412,4.751,4.751,0,0,0,3.384,1.4h0a4.752,4.752,0,0,0,3.385-1.4l5.8-5.8a4.786,4.786,0,0,0,0-6.771Z\"\/><\/g><\/svg><\/a>Timeline<\/h2>\n<ul role=\"list\" class=\"css-1ars4k6\">\n<li class=\"css-0\">15-03-2025 \u2013 Bug affecting Pectra EIP-2537 on Besu reported via the <a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-vezwxf\" href=\"https:\/\/cantina.xyz\/competitions\/pectra\">Pectra Audit Competition<\/a>.<\/li>\n<li class=\"css-0\">17-03-2025 \u2013 Discovered and reported the EIP-196\/EIP-197 issue to the Besu team.<\/li>\n<li class=\"css-0\">17-03-2025 \u2013 Marius Van Der Wijden created a test case and statetest to reproduce the issue.<\/li>\n<li class=\"css-0\">17-03-2025 \u2013 The Besu team promptly acknowledged and <a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-vezwxf\" href=\"https:\/\/github.com\/hyperledger\/besu-native\/commit\/73a307cd30f009db4ddfd8c79af5548fe51dfdda#diff-9622b17a1165cbfa1780cbc92d116bcbbcb4136daf03dd3d0aa4f9d77373a2dd\">fixed<\/a> the issue.<\/li>\n<\/ul>\n<\/div>\n<p><script async src=\"\/\/platform.twitter.com\/widgets.js\" charset=\"utf-8\"><\/script><br \/>\n<br \/><br \/>\n<br \/><a href=\"https:\/\/blog.ethereum.org\/en\/2025\/05\/07\/the-curious-case\">Source link <\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Thanks to Marius Van Der Wijden for creating the test case and statetest, and for helping the Besu team confirm the issue. Also, kudos to the Besu team, the EF security team, and Kevaundray Wedderburn. Additionally, thanks to Yuxiang Qiu, Justin Traglia, Marius Van Der Wijden, Benedikt Wagner, and Kevaundray Wedderburn for proofreading. If you [&hellip;]<\/p>\n","protected":false},"author":6,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"tdm_status":"","tdm_grid_status":"","footnotes":""},"categories":[24],"tags":[],"kronos_expire_date":[],"class_list":["post-17507","post","type-post","status-publish","format-standard","hentry","category-ethereum"],"_links":{"self":[{"href":"https:\/\/cryptoted.net\/index.php\/wp-json\/wp\/v2\/posts\/17507","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cryptoted.net\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/cryptoted.net\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/cryptoted.net\/index.php\/wp-json\/wp\/v2\/users\/6"}],"replies":[{"embeddable":true,"href":"https:\/\/cryptoted.net\/index.php\/wp-json\/wp\/v2\/comments?post=17507"}],"version-history":[{"count":0,"href":"https:\/\/cryptoted.net\/index.php\/wp-json\/wp\/v2\/posts\/17507\/revisions"}],"wp:attachment":[{"href":"https:\/\/cryptoted.net\/index.php\/wp-json\/wp\/v2\/media?parent=17507"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cryptoted.net\/index.php\/wp-json\/wp\/v2\/categories?post=17507"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cryptoted.net\/index.php\/wp-json\/wp\/v2\/tags?post=17507"},{"taxonomy":"kronos_expire_date","embeddable":true,"href":"https:\/\/cryptoted.net\/index.php\/wp-json\/wp\/v2\/kronos_expire_date?post=17507"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}