{"version":3,"file":"WJBZI1Ghk-80.CQl_5m0Z.mjs","names":["i","o","n","a"],"sources":["https:/framerusercontent.com/modules/xkgOTPH3D819XQA1Lv94/f7EzDt54JfBX9aTXubsh/WJBZI1Ghk-80.js"],"sourcesContent":["import{jsx as e,jsxs as t}from\"react/jsx-runtime\";import{ComponentPresetsConsumer as n,Link as i}from\"framer\";import{motion as o}from\"framer-motion\";import*as r from\"react\";import a from\"https://framerusercontent.com/modules/pVk4QsoHxASnVtUBp6jr/HTBsNkEMAb7TUGaO3DBy/CodeBlock.js\";export const richText=/*#__PURE__*/t(r.Fragment,{children:[/*#__PURE__*/e(\"h2\",{children:\"Most Git repositories have messy logs\"}),/*#__PURE__*/t(\"p\",{children:[\"Thanks to the \",/*#__PURE__*/e(i,{href:\"https://fluidattacks.com/services/continuous-hacking/\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!1,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"Continuous Hacking\"})}),\" service we offer at Fluid Attacks, we get to see Git repositories from different organizations in several countries. A vast majority of these repositories have messy logs.\"]}),/*#__PURE__*/e(\"p\",{children:\"Such problem can be easily explained: Teams do not stick to a specific standard when it comes to commit messages and general Git logging. Programmers just fill out their commit messages the way they personally think it is best.\"}),/*#__PURE__*/e(\"p\",{children:\"You may say: Ok, logs may be a little messy, but should I really care that much about them?\"}),/*#__PURE__*/e(\"p\",{children:\"The short answer is: Yes, you definitely should.\"}),/*#__PURE__*/t(\"p\",{children:[\"For the long answer, I am first going to number the cons of having messy \",/*#__PURE__*/e(\"code\",{children:\"Git\"}),\" logs.\"]}),/*#__PURE__*/e(\"h3\",{children:\"Cons\"}),/*#__PURE__*/t(\"ol\",{children:[/*#__PURE__*/t(\"li\",{\"data-preset-tag\":\"p\",children:[/*#__PURE__*/e(\"p\",{children:/*#__PURE__*/e(\"strong\",{children:\"Logs fail to accomplish their purpose:\"})}),/*#__PURE__*/e(\"p\",{children:\"Usually, due to vague or incomplete commit messages, a commit message log can only be understood by the one who wrote it (just like it happens with source code), thus making the log useless.\"})]}),/*#__PURE__*/t(\"li\",{\"data-preset-tag\":\"p\",children:[/*#__PURE__*/e(\"p\",{children:/*#__PURE__*/e(\"strong\",{children:\"Reverting becomes a headache:\"})}),/*#__PURE__*/e(\"p\",{children:\"If there is not a clear history of your repo, reverting to a previous version given the need will always be painful, as you will have to decipher such history in order to know to what point you want to go back.\"})]}),/*#__PURE__*/t(\"li\",{\"data-preset-tag\":\"p\",children:[/*#__PURE__*/e(\"p\",{children:/*#__PURE__*/e(\"strong\",{children:\"Knowing who did what becomes harder:\"})}),/*#__PURE__*/e(\"p\",{children:\"Good commit messages express, from a high level perspective, what changes were made. Not-so-good commit messages usually have two or three words and do not actually tell the reader what was changed, forcing him/her to look at the source code.\"})]})]}),/*#__PURE__*/t(\"p\",{children:[\"Lastly, let me bring it down to a specific example of how a \",/*#__PURE__*/e(\"code\",{children:\"Git\"}),\" repository history looks when programmers do whatever they want:\"]}),/*#__PURE__*/e(\"img\",{alt:\"Bad Git log\",className:\"framer-image\",height:\"450\",src:\"https://framerusercontent.com/images/2UOdW91Pwz5Nj57VPf4tvQeBmE.png\",srcSet:\"https://framerusercontent.com/images/2UOdW91Pwz5Nj57VPf4tvQeBmE.png?scale-down-to=512 512w,https://framerusercontent.com/images/2UOdW91Pwz5Nj57VPf4tvQeBmE.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/2UOdW91Pwz5Nj57VPf4tvQeBmE.png 1920w\",style:{aspectRatio:\"1920 / 900\"},width:\"960\"}),/*#__PURE__*/e(\"h6\",{children:\"Bad Git Log.\"}),/*#__PURE__*/e(\"p\",{children:\"Notice how these commit messages do not communicate anything regarding the changes that were made, they’re basically trash logs.\"}),/*#__PURE__*/e(\"h3\",{children:\"Pros\"}),/*#__PURE__*/e(\"p\",{children:\"Other than solving all the cons mentioned above, there are two extra pros:\"}),/*#__PURE__*/t(\"ol\",{children:[/*#__PURE__*/t(\"li\",{\"data-preset-tag\":\"p\",children:[/*#__PURE__*/e(\"p\",{children:/*#__PURE__*/e(\"strong\",{children:\"Data Analytics for the repo becomes possible:\"})}),/*#__PURE__*/e(\"p\",{children:\"When you have one hundred developers working simultaneously on a repository, you definitely want to know things like:\"}),/*#__PURE__*/t(\"ul\",{children:[/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"What percentage of time do they spend fixing bugs?\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"What percentage of the programmers focus on creating new features?\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"What are the main causes of reverts in the repo?\"})})]}),/*#__PURE__*/t(\"p\",{children:[\"And an endless number of questions whose answers might be incredibly useful for both business insights and development performance/quality improving within the company. By having a defined commit message syntax, such answers can be found by using \",/*#__PURE__*/e(i,{href:\"https://www.techopedia.com/definition/26418/data-analytics\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!0,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"Data Analytics\"})}),\" techniques\"]})]}),/*#__PURE__*/t(\"li\",{\"data-preset-tag\":\"p\",children:[/*#__PURE__*/e(\"p\",{children:/*#__PURE__*/e(\"strong\",{children:\"Logs (partially) become your documentation:\"})}),/*#__PURE__*/e(\"p\",{children:\"By standardizing commit messages, you will no longer have to create huge documentation manuals explaining all the details of how a product internally works. Each file within the repo will have its related history with detailed information about how it currently works and worked in the past. Some documentation will probably still be needed (user documentation, for example), but we have witnessed how the amount of documentation required dramatically diminishes thanks to good logs.\"})]})]}),/*#__PURE__*/e(\"p\",{children:\"After setting a standard syntax for commit messages, your repo history will start to look like this:\"}),/*#__PURE__*/e(\"img\",{alt:\"Good Git log\",className:\"framer-image\",height:\"540\",src:\"https://framerusercontent.com/images/D41to0sqpXWDAFLOFZZ5nJapp1Q.png\",srcSet:\"https://framerusercontent.com/images/D41to0sqpXWDAFLOFZZ5nJapp1Q.png?scale-down-to=512 512w,https://framerusercontent.com/images/D41to0sqpXWDAFLOFZZ5nJapp1Q.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/D41to0sqpXWDAFLOFZZ5nJapp1Q.png 1920w\",style:{aspectRatio:\"1920 / 1080\"},width:\"960\"}),/*#__PURE__*/e(\"h6\",{children:\"Good Git Log.\"}),/*#__PURE__*/e(\"p\",{children:\"I want you to notice the three most important details to begin with:\"}),/*#__PURE__*/t(\"ol\",{children:[/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[\"Titles include keywords like \",/*#__PURE__*/e(\"code\",{children:\"feat\"}),\", \",/*#__PURE__*/e(\"code\",{children:\"front\"}),\", \",/*#__PURE__*/e(\"code\",{children:\"fix\"}),\", \",/*#__PURE__*/e(\"code\",{children:\"doc\"}),\"…​ These tags will be essential for the Data Analytics efforts, as they will allow \",/*#__PURE__*/e(i,{href:\"https://fluidattacks.com/blog/crash-course-machine-learning/\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!1,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"algorithms\"})}),\" to know what the purpose of the commit was.\"]})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Body section is usually itemized, with every item describing relevant changes made in the commit.\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[\"An issue (#N.N) is always referenced with the purpose of understanding what the programmer was trying to do with the commit. This is useful for version control services with issue trackers like \",/*#__PURE__*/e(i,{href:\"https://gitlab.com/\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!0,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"Gitlab\"})}),\", \",/*#__PURE__*/e(i,{href:\"https://github.com/\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!0,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"Github\"})}),\", etc.\"]})})]}),/*#__PURE__*/e(\"h2\",{children:\"Implementing a commit message Syntax\"}),/*#__PURE__*/e(\"p\",{children:\"If by this point you are convinced about the importance of having a standard commit message syntax, and are interested in implementing it, make sure to keep reading, as I will show the syntax we use, the tools that support it, and the benefits we get from it.\"}),/*#__PURE__*/t(\"p\",{children:[\"In Fluid Attacks we use the \",/*#__PURE__*/e(i,{href:\"https://docs.google.com/document/d/1QrDFcIiPjSLDn3EL15IJygNPiHORgU1_OOAqWjiDU5Y/edit\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!0,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"Angular JS Commit Message Conventions\"})}),\" syntax with a few modifications inspired by our specific needs.\"]}),/*#__PURE__*/e(\"h3\",{children:\"Syntax\"}),/*#__PURE__*/e(\"p\",{children:\"The syntax is as follows:\"}),/*#__PURE__*/e(\"div\",{className:\"framer-text-module\",style:{height:\"auto\",width:\"100%\"},children:/*#__PURE__*/e(n,{componentIdentifier:\"module:pVk4QsoHxASnVtUBp6jr/HTBsNkEMAb7TUGaO3DBy/CodeBlock.js:default\",children:t=>/*#__PURE__*/e(a,{...t,code:\"  [type]([scope]): #[issue-number]{.issue-part} [title] // This is the commit title\\n                 // This blank line separates the commit title from the commit body\\n  [body]         // This is the commit body. It CAN have multiple lines\",language:\"Markdown\"})})}),/*#__PURE__*/e(\"p\",{children:\"Where:\"}),/*#__PURE__*/t(\"ul\",{children:[/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(\"strong\",{children:\"[variable]\"}),\" are \",/*#__PURE__*/e(\"strong\",{children:\"required\"}),\" variables that must be replaced in a final commit message (\",/*#__PURE__*/e(\"strong\",{children:\"[]\"}),\" symbols must be removed).\"]})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(\"strong\",{children:\"{variable}\"}),\" are \",/*#__PURE__*/e(\"strong\",{children:\"optional\"}),\" variables that must be replaced or removed in a final commit message (\",/*#__PURE__*/e(\"strong\",{children:\"{}\"}),\" symbols must be removed).\"]})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(\"strong\",{children:\"// Comment\"}),\" are comments that must be removed in a final commit message.\"]})})]}),/*#__PURE__*/e(\"p\",{children:\"In the following sections I will explain in detail what this syntax can help us achieve.\"}),/*#__PURE__*/e(\"h3\",{children:\"Types\"}),/*#__PURE__*/e(\"p\",{children:\"Types offer a high level perspective of the commit purpose. They are explicitly defined in a closed list that covers most (if not all) possible scenarios.\"}),/*#__PURE__*/t(\"p\",{children:[\"In the syntax, the \",/*#__PURE__*/e(\"strong\",{children:\"[type]\"}),\" variable has to be one of the following:\"]}),/*#__PURE__*/e(\"div\",{className:\"framer-text-module\",style:{height:\"auto\",width:\"100%\"},children:/*#__PURE__*/e(n,{componentIdentifier:\"module:pVk4QsoHxASnVtUBp6jr/HTBsNkEMAb7TUGaO3DBy/CodeBlock.js:default\",children:t=>/*#__PURE__*/e(a,{...t,code:\"  rever  // Revert to a previous commit in history\\n  feat   // New feature\\n  perf   // Improves performance\\n  fix    // Bug fix\\n  refac  // Neither fixes a bug or adds a feature\\n  test   // Adding missing tests or correcting existing tests\\n  style  // Do not affect the meaning of the code (formatting, etc)\",language:\"Markdown\"})})}),/*#__PURE__*/e(\"p\",{children:\"Notice how types are short words that can be easily read by anyone, but also represent keywords that can be processed by a machine.\"}),/*#__PURE__*/e(\"h3\",{children:\"Scopes\"}),/*#__PURE__*/e(\"p\",{children:\"Scopes provide specific detail about what part of the repository/system was modified in the commit. Just like types, they are explicitly defined in a closed list.\"}),/*#__PURE__*/t(\"p\",{children:[\"In the syntax, the \",/*#__PURE__*/e(\"strong\",{children:\"[scope]\"}),\" variable has to be one of the following:\"]}),/*#__PURE__*/e(\"div\",{className:\"framer-text-module\",style:{height:\"auto\",width:\"100%\"},children:/*#__PURE__*/e(n,{componentIdentifier:\"module:pVk4QsoHxASnVtUBp6jr/HTBsNkEMAb7TUGaO3DBy/CodeBlock.js:default\",children:t=>/*#__PURE__*/e(a,{...t,code:\"    front  // Front-End change\\n    back   // Back-End change\\n    infra  // Infrastructure change\\n    conf   // Configuration files change\\n    build  // Build system, CI, compilers, etc (scons, webpack...)\\n    job    // asynchronous or schedule tasks (backups, maintenance...)\\n    cross  // Mix of two or more scopes\\n    doc    // Documentation only changes\",language:\"Markdown\"})})}),/*#__PURE__*/e(\"p\",{children:\"Notice how scopes, just like types, are also human-readable and machine-readable.\"}),/*#__PURE__*/e(\"h3\",{children:\"Other important rules\"}),/*#__PURE__*/t(\"p\",{children:[\"Articles like \",/*#__PURE__*/e(i,{href:\"https://chris.beams.io/posts/git-commit/\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!0,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"this one\"})}),\" and learning on the fly helped us to define other rules for improving general commit message quality:\"]}),/*#__PURE__*/t(\"ol\",{children:[/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[\"A \",/*#__PURE__*/e(\"strong\",{children:\"Commit title\"}),\" must exist.\"]})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[\"A \",/*#__PURE__*/e(\"strong\",{children:\"Commit title\"}),\" must \",/*#__PURE__*/e(\"strong\",{children:\"not\"}),\" contain the '\",/*#__PURE__*/e(\"strong\",{children:\":\"}),\"' character aside from the one specified in the syntax.\"]})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[\"A \",/*#__PURE__*/e(\"strong\",{children:\"Commit title\"}),\" must have 50 characters or less.\"]})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[\"A \",/*#__PURE__*/e(\"strong\",{children:\"Commit title\"}),\" must be lower case.\"]})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[\"A \",/*#__PURE__*/e(\"strong\",{children:\"Commit title\"}),\" must not finish with a dot '\",/*#__PURE__*/e(\"strong\",{children:\".\"}),\"'.\"]})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[\"A \",/*#__PURE__*/e(\"strong\",{children:\"Commit title\"}),\" must reference an issue.\"]})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[\"A \",/*#__PURE__*/e(\"strong\",{children:\"Commit title\"}),\" must be meaningful. Avoid using things like \",/*#__PURE__*/e(\"code\",{children:\"feat(build): #5.1 feature\"}),\".\"]})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[\"A \",/*#__PURE__*/e(\"strong\",{children:\"blank line\"}),\" between commit title and commit body must exist.\"]})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[\"A \",/*#__PURE__*/e(\"strong\",{children:\"commit body\"}),\" must exist.\"]})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[\"Lines in \",/*#__PURE__*/e(\"strong\",{children:\"commit body\"}),\" must be 72 characters or less.\"]})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[\"Try to itemize your \",/*#__PURE__*/e(\"strong\",{children:\"commit body\"}),\".\"]})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[\"Do \",/*#__PURE__*/e(\"strong\",{children:\"not\"}),\" use the word '\",/*#__PURE__*/e(\"strong\",{children:\"part\"}),\"' for splitting commits for a single issue. Use \",/*#__PURE__*/e(\"strong\",{children:\"#[issue-number]{.issue-part}\"}),\" instead as specified in the syntax.\"]})})]}),/*#__PURE__*/e(\"h3\",{children:\"Explaining combinations\"}),/*#__PURE__*/e(\"p\",{children:\"Below is a table explaining all the possible combinations between types and scopes for a commit message (Types are columns, scopes are rows):\"}),/*#__PURE__*/e(\"figure\",{className:\"framer-table-wrapper\",children:/*#__PURE__*/e(\"table\",{children:/*#__PURE__*/t(\"tbody\",{children:[/*#__PURE__*/t(\"tr\",{children:[/*#__PURE__*/e(\"th\",{children:/*#__PURE__*/e(\"p\",{children:/*#__PURE__*/e(\"br\",{className:\"trailing-break\"})})}),/*#__PURE__*/e(\"th\",{children:/*#__PURE__*/e(\"p\",{children:\"rever\"})}),/*#__PURE__*/e(\"th\",{children:/*#__PURE__*/e(\"p\",{children:\"feat\"})}),/*#__PURE__*/e(\"th\",{children:/*#__PURE__*/e(\"p\",{children:\"perf\"})}),/*#__PURE__*/e(\"th\",{children:/*#__PURE__*/e(\"p\",{children:\"fix\"})}),/*#__PURE__*/e(\"th\",{children:/*#__PURE__*/e(\"p\",{children:\"refac\"})}),/*#__PURE__*/e(\"th\",{children:/*#__PURE__*/e(\"p\",{children:\"test\"})}),/*#__PURE__*/e(\"th\",{children:/*#__PURE__*/e(\"p\",{children:\"style\"})})]}),/*#__PURE__*/t(\"tr\",{children:[/*#__PURE__*/e(\"td\",{children:/*#__PURE__*/e(\"p\",{children:/*#__PURE__*/e(\"strong\",{children:\"front\"})})}),/*#__PURE__*/e(\"td\",{children:/*#__PURE__*/e(\"p\",{children:\"Revert front-end to a previous version\"})}),/*#__PURE__*/e(\"td\",{children:/*#__PURE__*/e(\"p\",{children:\"Add new feature to front-end\"})}),/*#__PURE__*/e(\"td\",{children:/*#__PURE__*/e(\"p\",{children:\"Improve perf in front-end\"})}),/*#__PURE__*/e(\"td\",{children:/*#__PURE__*/e(\"p\",{children:\"Fix something in front-end\"})}),/*#__PURE__*/e(\"td\",{children:/*#__PURE__*/e(\"p\",{children:\"Change something in front-end\"})}),/*#__PURE__*/e(\"td\",{children:/*#__PURE__*/e(\"p\",{children:\"Add tests for front-end\"})}),/*#__PURE__*/e(\"td\",{children:/*#__PURE__*/e(\"p\",{children:\"Change front-end code style\"})})]}),/*#__PURE__*/t(\"tr\",{children:[/*#__PURE__*/e(\"td\",{children:/*#__PURE__*/e(\"p\",{children:/*#__PURE__*/e(\"strong\",{children:\"back\"})})}),/*#__PURE__*/e(\"td\",{children:/*#__PURE__*/e(\"p\",{children:\"Revert back-end to a previous version\"})}),/*#__PURE__*/e(\"td\",{children:/*#__PURE__*/e(\"p\",{children:\"Add new feature to back-end\"})}),/*#__PURE__*/e(\"td\",{children:/*#__PURE__*/e(\"p\",{children:\"Improve perf in back-end\"})}),/*#__PURE__*/e(\"td\",{children:/*#__PURE__*/e(\"p\",{children:\"Fix something in back-end\"})}),/*#__PURE__*/e(\"td\",{children:/*#__PURE__*/e(\"p\",{children:\"Change something in back-end\"})}),/*#__PURE__*/e(\"td\",{children:/*#__PURE__*/e(\"p\",{children:\"Add tests for back-end\"})}),/*#__PURE__*/e(\"td\",{children:/*#__PURE__*/e(\"p\",{children:\"Change back-end code style\"})})]}),/*#__PURE__*/t(\"tr\",{children:[/*#__PURE__*/e(\"td\",{children:/*#__PURE__*/e(\"p\",{children:/*#__PURE__*/e(\"strong\",{children:\"infra\"})})}),/*#__PURE__*/e(\"td\",{children:/*#__PURE__*/e(\"p\",{children:\"Revert infra to a previous version\"})}),/*#__PURE__*/e(\"td\",{children:/*#__PURE__*/e(\"p\",{children:\"Add new feature to infra\"})}),/*#__PURE__*/e(\"td\",{children:/*#__PURE__*/e(\"p\",{children:\"Improve perf in infra\"})}),/*#__PURE__*/e(\"td\",{children:/*#__PURE__*/e(\"p\",{children:\"Fix something in infra\"})}),/*#__PURE__*/e(\"td\",{children:/*#__PURE__*/e(\"p\",{children:\"Change something in infra\"})}),/*#__PURE__*/e(\"td\",{children:/*#__PURE__*/e(\"p\",{children:\"Add tests for infra\"})}),/*#__PURE__*/e(\"td\",{children:/*#__PURE__*/e(\"p\",{children:\"Change infra code style\"})})]}),/*#__PURE__*/t(\"tr\",{children:[/*#__PURE__*/e(\"td\",{children:/*#__PURE__*/e(\"p\",{children:/*#__PURE__*/e(\"strong\",{children:\"conf\"})})}),/*#__PURE__*/e(\"td\",{children:/*#__PURE__*/e(\"p\",{children:\"Revert config files to a previous version\"})}),/*#__PURE__*/e(\"td\",{children:/*#__PURE__*/e(\"p\",{children:\"Add new feature to config files\"})}),/*#__PURE__*/e(\"td\",{children:/*#__PURE__*/e(\"p\",{children:\"NA\"})}),/*#__PURE__*/e(\"td\",{children:/*#__PURE__*/e(\"p\",{children:\"Fix something in config files\"})}),/*#__PURE__*/e(\"td\",{children:/*#__PURE__*/e(\"p\",{children:\"Change something in config files\"})}),/*#__PURE__*/e(\"td\",{children:/*#__PURE__*/e(\"p\",{children:\"NA\"})}),/*#__PURE__*/e(\"td\",{children:/*#__PURE__*/e(\"p\",{children:\"Change config files code style\"})})]}),/*#__PURE__*/t(\"tr\",{children:[/*#__PURE__*/e(\"td\",{children:/*#__PURE__*/e(\"p\",{children:/*#__PURE__*/e(\"strong\",{children:\"build\"})})}),/*#__PURE__*/e(\"td\",{children:/*#__PURE__*/e(\"p\",{children:\"Revert building tools to a previous version\"})}),/*#__PURE__*/e(\"td\",{children:/*#__PURE__*/e(\"p\",{children:\"Add new feature to building tools or add a new building tool\"})}),/*#__PURE__*/e(\"td\",{children:/*#__PURE__*/e(\"p\",{children:\"Improve building perf\"})}),/*#__PURE__*/e(\"td\",{children:/*#__PURE__*/e(\"p\",{children:\"Fix something in building tools\"})}),/*#__PURE__*/e(\"td\",{children:/*#__PURE__*/e(\"p\",{children:\"Change something in building tools\"})}),/*#__PURE__*/e(\"td\",{children:/*#__PURE__*/e(\"p\",{children:\"Add tests for building tools\"})}),/*#__PURE__*/e(\"td\",{children:/*#__PURE__*/e(\"p\",{children:\"Change building tools code style\"})})]}),/*#__PURE__*/t(\"tr\",{children:[/*#__PURE__*/e(\"td\",{children:/*#__PURE__*/e(\"p\",{children:/*#__PURE__*/e(\"strong\",{children:\"job\"})})}),/*#__PURE__*/e(\"td\",{children:/*#__PURE__*/e(\"p\",{children:\"Revert jobs to a previous version\"})}),/*#__PURE__*/e(\"td\",{children:/*#__PURE__*/e(\"p\",{children:\"Add new feature to jobs or add a new job\"})}),/*#__PURE__*/e(\"td\",{children:/*#__PURE__*/e(\"p\",{children:\"Improve jobs perf\"})}),/*#__PURE__*/e(\"td\",{children:/*#__PURE__*/e(\"p\",{children:\"Fix something in jobs\"})}),/*#__PURE__*/e(\"td\",{children:/*#__PURE__*/e(\"p\",{children:\"Change something in jobs\"})}),/*#__PURE__*/e(\"td\",{children:/*#__PURE__*/e(\"p\",{children:\"Add tests for jobs\"})}),/*#__PURE__*/e(\"td\",{children:/*#__PURE__*/e(\"p\",{children:\"Change jobs code style\"})})]}),/*#__PURE__*/t(\"tr\",{children:[/*#__PURE__*/e(\"td\",{children:/*#__PURE__*/e(\"p\",{children:/*#__PURE__*/e(\"strong\",{children:\"cross\"})})}),/*#__PURE__*/e(\"td\",{children:/*#__PURE__*/e(\"p\",{children:\"Revert several scopes to a previous version\"})}),/*#__PURE__*/e(\"td\",{children:/*#__PURE__*/e(\"p\",{children:\"Add new feature for several scopes\"})}),/*#__PURE__*/e(\"td\",{children:/*#__PURE__*/e(\"p\",{children:\"Improve perf in several system parts\"})}),/*#__PURE__*/e(\"td\",{children:/*#__PURE__*/e(\"p\",{children:\"Fix something in several system parts\"})}),/*#__PURE__*/e(\"td\",{children:/*#__PURE__*/e(\"p\",{children:\"Change something in several system parts\"})}),/*#__PURE__*/e(\"td\",{children:/*#__PURE__*/e(\"p\",{children:\"Add tests for several system parts\"})}),/*#__PURE__*/e(\"td\",{children:/*#__PURE__*/e(\"p\",{children:\"Change code style in several system parts\"})})]}),/*#__PURE__*/t(\"tr\",{children:[/*#__PURE__*/e(\"td\",{children:/*#__PURE__*/e(\"p\",{children:/*#__PURE__*/e(\"strong\",{children:\"doc\"})})}),/*#__PURE__*/e(\"td\",{children:/*#__PURE__*/e(\"p\",{children:\"Revert doc to a previous version\"})}),/*#__PURE__*/e(\"td\",{children:/*#__PURE__*/e(\"p\",{children:\"Add new doc\"})}),/*#__PURE__*/e(\"td\",{children:/*#__PURE__*/e(\"p\",{children:\"NA\"})}),/*#__PURE__*/e(\"td\",{children:/*#__PURE__*/e(\"p\",{children:\"Fix something in doc\"})}),/*#__PURE__*/e(\"td\",{children:/*#__PURE__*/e(\"p\",{children:\"Change something in doc\"})}),/*#__PURE__*/e(\"td\",{children:/*#__PURE__*/e(\"p\",{children:\"NA\"})}),/*#__PURE__*/e(\"td\",{children:/*#__PURE__*/e(\"p\",{children:\"Change doc style\"})})]})]})})}),/*#__PURE__*/e(\"p\",{children:\"Where:\"}),/*#__PURE__*/t(\"ul\",{children:[/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(\"code\",{children:\"perf\"}),\" is performance.\"]})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(\"code\",{children:\"infra\"}),\" is infrastructure.\"]})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(\"code\",{children:\"config\"}),\" is configuration.\"]})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(\"code\",{children:\"doc\"}),\" is documentation.\"]})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(\"code\",{children:\"NA\"}),\" is not applicable.\"]})})]}),/*#__PURE__*/e(\"h2\",{children:\"Differences with pure AngularJS syntax\"}),/*#__PURE__*/t(\"p\",{children:[\"In this section I will talk about the changes we made to the original \",/*#__PURE__*/e(\"code\",{children:\"AngularJS\"}),\" syntax and the reasons behind them.\"]}),/*#__PURE__*/e(\"h3\",{children:\"Types\"}),/*#__PURE__*/t(\"ol\",{children:[/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[\"Instead of creating a particular syntax only for reverts as specified in the \",/*#__PURE__*/e(i,{href:\"https://docs.google.com/document/d/1QrDFcIiPjSLDn3EL15IJygNPiHORgU1_OOAqWjiDU5Y/edit#heading=h.fpepsvr2gqby\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!0,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"AngularJS' document\"})}),\", for the sake of simplicity, we decided to make a \",/*#__PURE__*/e(\"strong\",{children:\"rever\"}),\" type that follows the same syntax as everything else.\"]})}),/*#__PURE__*/t(\"li\",{\"data-preset-tag\":\"p\",children:[/*#__PURE__*/t(\"p\",{children:[\"The \",/*#__PURE__*/e(\"strong\",{children:\"docs\"}),\" type was renamed to \",/*#__PURE__*/e(\"strong\",{children:\"doc\"}),\" and turned into a scope. The reason of such change was to make \",/*#__PURE__*/e(\"strong\",{children:\"doc\"}),\" commits more informative by allowing programmers to specify the purpose of the documentation change. For example:\"]}),/*#__PURE__*/t(\"ul\",{children:[/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(\"strong\",{children:\"feat(doc):\"}),\" documenting new feature.\"]})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(\"strong\",{children:\"fix(doc):\"}),\" fixing documentation.\"]})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(\"strong\",{children:\"style(doc):\"}),\" changing its style.\"]})})]})]}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[\"We added a \",/*#__PURE__*/e(\"strong\",{children:\"perf\"}),\" type for performance changes with the purpose of identifying what commits have a performance improvement as main objective and reducing the number of commits that would fall under the \",/*#__PURE__*/e(\"strong\",{children:\"refac\"}),\" type.\"]})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(\"strong\",{children:\"chore\"}),\" type was removed as any maintenance commit can be translated to a \",/*#__PURE__*/e(\"strong\",{children:\"perf\"}),\"/\",/*#__PURE__*/e(\"strong\",{children:\"refac\"}),\"/\",/*#__PURE__*/e(\"strong\",{children:\"fix\"}),\" commit.\"]})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[\"In order to have shorter commit titles, we shortened types like \",/*#__PURE__*/e(\"strong\",{children:\"docs\"}),\" to \",/*#__PURE__*/e(\"strong\",{children:\"doc\"}),\", \",/*#__PURE__*/e(\"strong\",{children:\"revert\"}),\" to \",/*#__PURE__*/e(\"strong\",{children:\"rever\"}),\", \",/*#__PURE__*/e(\"strong\",{children:\"refactor\"}),\" to \",/*#__PURE__*/e(\"strong\",{children:\"refac\"}),\".\"]})})]}),/*#__PURE__*/e(\"h3\",{children:\"Scopes\"}),/*#__PURE__*/t(\"p\",{children:[\"When it comes to scopes, the difference consists in us having a closed list of keywords while \",/*#__PURE__*/e(\"code\",{children:\"AngularJS\"}),\" allowing programmers to specify any scope they want.\"]}),/*#__PURE__*/t(\"p\",{children:[\"According to the \",/*#__PURE__*/e(\"code\",{children:\"AngularJS\"}),\" document, “Scope can be anything specifying place of the commit change. For example \",/*#__PURE__*/e(\"code\",{children:\"$location\"}),\", \",/*#__PURE__*/e(\"code\",{children:\"$browser\"}),\", \",/*#__PURE__*/e(\"code\",{children:\"$compile\"}),\", \",/*#__PURE__*/e(\"code\",{children:\"$rootScope\"}),\", \",/*#__PURE__*/e(\"code\",{children:\"ngHref\"}),\", \",/*#__PURE__*/e(\"code\",{children:\"ngClick\"}),\", \",/*#__PURE__*/e(\"code\",{children:\"ngView\"}),\", etc…​”.\"]}),/*#__PURE__*/t(\"p\",{children:[\"We, on the other hand, consider that this information should go in the commit \",/*#__PURE__*/e(\"strong\",{children:\"[title]\"}),\".\"]}),/*#__PURE__*/t(\"p\",{children:[\"By moving the “place of the commit change” to the \",/*#__PURE__*/e(\"strong\",{children:\"[title]\"}),\", we get to define some generic scopes that allow us to make commit messages more informative.\"]}),/*#__PURE__*/t(\"p\",{children:[\"Scopes like \",/*#__PURE__*/e(\"strong\",{children:\"front\"}),\", \",/*#__PURE__*/e(\"strong\",{children:\"back\"}),\", \",/*#__PURE__*/e(\"strong\",{children:\"build\"}),\", etc, although not as precise as \",/*#__PURE__*/e(\"strong\",{children:\"ngClick\"}),\", are machine-readable and still provide information about where the change was made. This, combined with allowing the programmer to be more specific in the \",/*#__PURE__*/e(\"strong\",{children:\"[title]\"}),\", is why we decided to create a closed list for scopes.\"]}),/*#__PURE__*/e(\"h3\",{children:\"Other differences\"}),/*#__PURE__*/t(\"p\",{children:[\"The last big difference between the \",/*#__PURE__*/e(\"code\",{children:\"AngularJS\"}),\" syntax and ours is the \",/*#__PURE__*/e(\"strong\",{children:\"#[issue-number]{.issue-part}\"}),\" part, whose purpose is to force commits to always reference an issue in order to be able to track what motivated such commit.\"]}),/*#__PURE__*/t(\"p\",{children:[\"Other minor differences, like making a maximum of 50 characters for the commit title mandatory, are either based on personal opinions of what we think makes a commit message look better, or preferring rules taken from other places over the \",/*#__PURE__*/e(\"code\",{children:\"AngularJS\"}),\" ones.\"]}),/*#__PURE__*/e(\"h2\",{children:\"Make syntax usage a reality\"}),/*#__PURE__*/e(\"p\",{children:\"You may be thinking: Ok, we just defined a huge commit message syntax with a ton of rules. But, how are we actually going to make programmers follow it in a pragmatic way?\"}),/*#__PURE__*/t(\"p\",{children:[\"Enter the savior: \",/*#__PURE__*/e(i,{href:\"https://conventional-changelog.github.io/commitlint/#/\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!0,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"Commitlint\"})}),\".\"]}),/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(\"code\",{children:\"Commitlint\"}),\" is an incredible tool that can check all the syntax we just defined. Not only it runs all the checks instantly, but it works as a \",/*#__PURE__*/e(i,{href:\"https://git-scm.com/book/uz/v2/Customizing-Git-Git-Hooks\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!0,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"Git hook\"})}),\", which means that it runs all the checks right after a programmer runs a \",/*#__PURE__*/e(\"strong\",{children:\"git commit\"}),\" command on his/her local machine. It is even capable of \",/*#__PURE__*/e(\"strong\",{children:\"failing\"}),\" the commit attempt if the commit message the programmer just provided happens to be non-syntax-compliant.\"]}),/*#__PURE__*/e(\"h3\",{children:\"Proof of concept\"}),/*#__PURE__*/t(\"p\",{children:[\"We won’t be setting up \",/*#__PURE__*/e(\"code\",{children:\"Commitlint\"}),\" for this specific syntax as it would make the article too technical. Nevertheless, I will show you how it currently works in one of our repos:\"]}),/*#__PURE__*/e(\"h3\",{children:\"Bad commit message\"}),/*#__PURE__*/e(\"img\",{alt:\"Failed commit\",className:\"framer-image\",height:\"291\",src:\"https://framerusercontent.com/images/DhVuOfkOPustMH6vERevKU39Y0.gif\",srcSet:\"https://framerusercontent.com/images/DhVuOfkOPustMH6vERevKU39Y0.gif?scale-down-to=512 512w,https://framerusercontent.com/images/DhVuOfkOPustMH6vERevKU39Y0.gif 867w\",style:{aspectRatio:\"867 / 582\"},width:\"433\"}),/*#__PURE__*/e(\"h6\",{children:\"Failed commit.\"}),/*#__PURE__*/e(\"p\",{children:\"The commit we entered was:\"}),/*#__PURE__*/e(\"img\",{alt:\"Bad commit message\",className:\"framer-image\",height:\"250\",src:\"https://framerusercontent.com/images/iH4aRyTMb6T89dxsey9xml1TA.png\",srcSet:\"https://framerusercontent.com/images/iH4aRyTMb6T89dxsey9xml1TA.png?scale-down-to=512 512w,https://framerusercontent.com/images/iH4aRyTMb6T89dxsey9xml1TA.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/iH4aRyTMb6T89dxsey9xml1TA.png 1920w\",style:{aspectRatio:\"1920 / 500\"},width:\"960\"}),/*#__PURE__*/e(\"h6\",{children:\"Bad commit message.\"}),/*#__PURE__*/t(\"p\",{children:[\"The \",/*#__PURE__*/e(\"code\",{children:\"Commitlint\"}),\" output was:\"]}),/*#__PURE__*/e(\"img\",{alt:\"Failed commitlint\",className:\"framer-image\",height:\"300\",src:\"https://framerusercontent.com/images/2chgHA28GRbvyDQ49JehjRRM1FY.png\",srcSet:\"https://framerusercontent.com/images/2chgHA28GRbvyDQ49JehjRRM1FY.png?scale-down-to=512 512w,https://framerusercontent.com/images/2chgHA28GRbvyDQ49JehjRRM1FY.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/2chgHA28GRbvyDQ49JehjRRM1FY.png 1920w\",style:{aspectRatio:\"1920 / 600\"},width:\"960\"}),/*#__PURE__*/e(\"h6\",{children:\"Failed Commitlint output.\"}),/*#__PURE__*/t(\"p\",{children:[\"Notice how \",/*#__PURE__*/e(\"code\",{children:\"Commitlint\"}),\" dynamically tells the programmer what specific rules his/her commit message is not following, making the fix process a lot easier. The commit attempt was also stopped by \",/*#__PURE__*/e(\"code\",{children:\"Commitlint\"}),\", as it doesn’t allow commits to pass unless their message is syntax compliant.\"]}),/*#__PURE__*/e(\"h3\",{children:\"Good commit message\"}),/*#__PURE__*/e(\"img\",{alt:\"Passed commit\",className:\"framer-image\",height:\"291\",src:\"https://framerusercontent.com/images/ERLMXLgEuECkhy5MiFqnSYzw.gif\",srcSet:\"https://framerusercontent.com/images/ERLMXLgEuECkhy5MiFqnSYzw.gif?scale-down-to=512 512w,https://framerusercontent.com/images/ERLMXLgEuECkhy5MiFqnSYzw.gif 867w\",style:{aspectRatio:\"867 / 582\"},width:\"433\"}),/*#__PURE__*/e(\"h6\",{children:\"Passed commit.\"}),/*#__PURE__*/e(\"p\",{children:\"The commit we entered was:\"}),/*#__PURE__*/e(\"img\",{alt:\"Good commit message\",className:\"framer-image\",height:\"300\",src:\"https://framerusercontent.com/images/oqhfJ6Q7mmMpe6A0BhktXhBDNY.png\",srcSet:\"https://framerusercontent.com/images/oqhfJ6Q7mmMpe6A0BhktXhBDNY.png?scale-down-to=512 512w,https://framerusercontent.com/images/oqhfJ6Q7mmMpe6A0BhktXhBDNY.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/oqhfJ6Q7mmMpe6A0BhktXhBDNY.png 1920w\",style:{aspectRatio:\"1920 / 600\"},width:\"960\"}),/*#__PURE__*/e(\"h6\",{children:\"Good commit message.\"}),/*#__PURE__*/t(\"p\",{children:[\"The \",/*#__PURE__*/e(\"code\",{children:\"Commitlint\"}),\" output was:\"]}),/*#__PURE__*/e(\"img\",{alt:\"Passed commitlint\",className:\"framer-image\",height:\"255\",src:\"https://framerusercontent.com/images/CQsjRnaXfvB5oaorQSfavPqwm3Q.png\",srcSet:\"https://framerusercontent.com/images/CQsjRnaXfvB5oaorQSfavPqwm3Q.png?scale-down-to=512 512w,https://framerusercontent.com/images/CQsjRnaXfvB5oaorQSfavPqwm3Q.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/CQsjRnaXfvB5oaorQSfavPqwm3Q.png 1920w\",style:{aspectRatio:\"1920 / 510\"},width:\"960\"}),/*#__PURE__*/e(\"h6\",{children:\"Passed Commitlint output.\"}),/*#__PURE__*/t(\"p\",{children:[\"Notice how \",/*#__PURE__*/e(\"code\",{children:\"Commitlint\"}),\" tells the programmer that all checks passed and proceeds to accept the commit.\"]}),/*#__PURE__*/e(\"h2\",{children:\"A little bit of Data Analytics\"}),/*#__PURE__*/t(\"p\",{children:[\"Now that we have defined a commit message syntax, I would like to show you a few very simple \",/*#__PURE__*/e(\"code\",{children:/*#__PURE__*/e(i,{href:\"https://chartio.com/\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!0,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"Chartio\"})})}),\" charts we are now able to generate from our \",/*#__PURE__*/e(i,{href:\"https://gitlab.com/fluidattacks/integrates\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!0,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"Integrates\"})}),\" repository:\"]}),/*#__PURE__*/e(\"h3\",{children:\"Pie chart of monthly commit types for February 2019\"}),/*#__PURE__*/e(\"img\",{alt:\"Commit types\",className:\"framer-image\",height:\"400\",src:\"https://framerusercontent.com/images/Xxdtuo3H3bkw3jkkSuySn0AGwJM.png\",srcSet:\"https://framerusercontent.com/images/Xxdtuo3H3bkw3jkkSuySn0AGwJM.png?scale-down-to=512 512w,https://framerusercontent.com/images/Xxdtuo3H3bkw3jkkSuySn0AGwJM.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/Xxdtuo3H3bkw3jkkSuySn0AGwJM.png 1920w\",style:{aspectRatio:\"1920 / 800\"},width:\"960\"}),/*#__PURE__*/e(\"h6\",{children:\"Monthly commit types for February 2019.\"}),/*#__PURE__*/e(\"p\",{children:\"This chart allows us to know the percentage of commits for every type in a month.\"}),/*#__PURE__*/e(\"p\",{children:\"One possible interpretation can be:\"}),/*#__PURE__*/e(\"p\",{children:\"During February, 2019, out of 132 commits, 39.4% of them (52) had developing a new feature as their purpose.\"}),/*#__PURE__*/e(\"h3\",{children:\"Pie chart of monthly commit scopes for February 2019\"}),/*#__PURE__*/e(\"img\",{alt:\"Commit scope\",className:\"framer-image\",height:\"400\",src:\"https://framerusercontent.com/images/qoyJsLFxCr4oDyIk2pfPTxx3LCk.png\",srcSet:\"https://framerusercontent.com/images/qoyJsLFxCr4oDyIk2pfPTxx3LCk.png?scale-down-to=512 512w,https://framerusercontent.com/images/qoyJsLFxCr4oDyIk2pfPTxx3LCk.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/qoyJsLFxCr4oDyIk2pfPTxx3LCk.png 1920w\",style:{aspectRatio:\"1920 / 800\"},width:\"960\"}),/*#__PURE__*/e(\"h6\",{children:\"Monthly commit scopes.\"}),/*#__PURE__*/e(\"p\",{children:\"This chart allows us to know the percentage of commits for every scope in a month.\"}),/*#__PURE__*/e(\"p\",{children:\"One possible interpretation can be:\"}),/*#__PURE__*/e(\"p\",{children:\"During February, 2019, out of 132 commits, 33.3% of them (44) were focused on the back-end of the site.\"}),/*#__PURE__*/e(\"h3\",{children:\"Heatmap chart of monthly commit types vs scopes for February 2019\"}),/*#__PURE__*/e(\"img\",{alt:\"Commit heatmap\",className:\"framer-image\",height:\"400\",src:\"https://framerusercontent.com/images/iaU4NjrFcYRg9xWxtA8y6ciEfg.png\",srcSet:\"https://framerusercontent.com/images/iaU4NjrFcYRg9xWxtA8y6ciEfg.png?scale-down-to=512 512w,https://framerusercontent.com/images/iaU4NjrFcYRg9xWxtA8y6ciEfg.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/iaU4NjrFcYRg9xWxtA8y6ciEfg.png 1920w\",style:{aspectRatio:\"1920 / 800\"},width:\"960\"}),/*#__PURE__*/e(\"h6\",{children:\"Monthly commit heatmap.\"}),/*#__PURE__*/e(\"p\",{children:\"This chart allows us to know:\"}),/*#__PURE__*/t(\"ul\",{children:[/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"What type/scope combinations were mostly used.\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"What type/scope combinations were never used.\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"In general, we can get insights about what programmers did and where they did it.\"})})]}),/*#__PURE__*/e(\"p\",{children:\"One possible interpretation can be:\"}),/*#__PURE__*/e(\"p\",{children:\"During February, 2019, out of 132 commits, 20 of them were feat(back), leading us to think that programmers spent a considerable amount of their time programming new functionalities in the back-end of the site.\"}),/*#__PURE__*/e(\"h2\",{children:\"It does not end here\"}),/*#__PURE__*/t(\"p\",{children:[\"Now that we have a commit message syntax and our \",/*#__PURE__*/e(\"code\",{children:\"Git\"}),\" logs are growing everyday, it is up to us to think what we want to do with the normalized data we’re getting.\"]}),/*#__PURE__*/e(\"p\",{children:\"Many different charts and analysis can be done, it is just a matter of asking ourselves:\"}),/*#__PURE__*/t(\"ol\",{children:[/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"What do we want to know?\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Can we know it with the data we currently have?\"})})]}),/*#__PURE__*/e(\"p\",{children:\"if so, lets make it happen!\"}),/*#__PURE__*/e(\"h2\",{children:\"Conclusion\"}),/*#__PURE__*/t(\"p\",{children:[\"In this article we’ve covered from the importance of \",/*#__PURE__*/e(\"code\",{children:\"Git\"}),\" logs to what benefits we can obtain by standardizing our commit message syntax and implementing tools for checks like \",/*#__PURE__*/e(\"code\",{children:\"Commitlint\"}),\", being Data Analytics the most important one.\"]}),/*#__PURE__*/t(\"p\",{children:[\"I invite you to check the commit history of our public repository: \",/*#__PURE__*/e(i,{href:\"https://gitlab.com/fluidattacks/universe/commits/master\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!0,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"Product\"})}),\".\"]}),/*#__PURE__*/e(\"h3\",{children:\"Want to get more technical?\"}),/*#__PURE__*/t(\"p\",{children:[\"Make sure to visit our \",/*#__PURE__*/e(i,{href:\"https://gitlab.com/fluidattacks/default/wikis/Commit-and-MR-Messages\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!0,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"Commit Message Documentation Page\"})}),\". There you will be able to find more detailed information regarding our commit message syntax and other interesting topics like expanding syntax checks to \",/*#__PURE__*/e(\"code\",{children:\"Gitlab\"}),\" Merge Requests.\"]}),/*#__PURE__*/e(\"p\",{children:\"That was it! Have a good one!\"})]});export const richText1=/*#__PURE__*/t(r.Fragment,{children:[/*#__PURE__*/e(\"p\",{children:\"In our previous article, we merely scratched the surface of the problem that quantifying risks poses, barely touching on concepts such as calibrated estimation, confidence intervals and specifying the measuring object. Now that (if?) we are convinced that:\"}),/*#__PURE__*/t(\"ul\",{children:[/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:'Cybersecurity risk can and should be measured in time-framed probabilities rather than \"low\", \"medium\" or \"high\".'})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Estimates should be made not as unrealistic point estimates, but instead as confidence intervals which allow room for uncertainty.\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Even small data can tell us a lot if we use the right tools. Quantitative methods are applicable wherever less precise methods are.\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Experts can make good estimates with the right training.\"})})]}),/*#__PURE__*/e(\"p\",{children:\"Let us see how we can turn that into dollars and cents.\"}),/*#__PURE__*/t(\"p\",{children:[\"Suppose we want to measure the loss incurred by suffering a denial of service attack (the \",/*#__PURE__*/e(\"em\",{children:\"risk\"}),\"). We can decompose the problem into the number of systems affected, the number of hours these are out of service, the revenue streams that rely on these systems, and so a trained expert from your company estimates, with 90% confidence, that the associated loss can fall anywhere between $2 and $7 million. This is our calibrated estimate of the \",/*#__PURE__*/e(\"em\",{children:\"impact\"}),\" to the organization.\"]}),/*#__PURE__*/t(\"p\",{children:['Now, instead of rating the \"likelihood\" on a scale from 1 to 5 as is done in the risk \"matrices\", allow the experts from your ',/*#__PURE__*/e(i,{href:\"https://fluidattacks.com/\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!1,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"security testers\"})}),' to make an estimate in terms of probabilities. Something like \"there is a 15% chance that the organization undergoes a denial of service\" is what we need to hear here. This particular estimate could be averaged with the ones given by other experts, if need be.']}),/*#__PURE__*/t(\"p\",{children:[\"These are all the inputs needed to run a simulation from which we can extract the expected loss associated to a particular risk, the probability of such loss or more, or the overall company-wide loss expected from IT assets, by running a so-called \",/*#__PURE__*/e(\"em\",{children:\"Monte Carlo simulation\"}),\". In a nutshell, this means that we’re going to simulate the events in a year many times and average the results. A risk happens or not depending on the likelihood given above and the associated costs are taken at random from the above confidence interval.\"]}),/*#__PURE__*/t(\"p\",{children:['For a single \"simulated year\", we just need to generate a random number between 0 and 1. If it is below .15, we say that the event happened. Simple. Now we need to figure out how much we lost. The random number generated above was easy because all numbers between 0 and 1 are equally likely. This is called a ',/*#__PURE__*/e(\"em\",{children:\"uniform distribution\"}),\". However, in the case of losses, not all numbers are equally likely. We need to generate them according to a different \",/*#__PURE__*/e(\"em\",{children:\"probability distribution\"}),\" which responds to two things: the confidence interval (\",/*#__PURE__*/e(\"code\",{children:\"CI\"}),\") estimated by the expert, and its values should always be positive. The most popular distribution for modeling is the \",/*#__PURE__*/e(\"em\",{children:\"normal\"}),\" distribution, a.k.a. the Gaussian bell:\"]}),/*#__PURE__*/e(\"img\",{alt:\"Effect of the mean parameter\",className:\"framer-image\",height:\"400\",src:\"https://framerusercontent.com/images/VRgNjFvrjsSrPtqJJyPZE6xRhk.png\",srcSet:\"https://framerusercontent.com/images/VRgNjFvrjsSrPtqJJyPZE6xRhk.png?scale-down-to=512 512w,https://framerusercontent.com/images/VRgNjFvrjsSrPtqJJyPZE6xRhk.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/VRgNjFvrjsSrPtqJJyPZE6xRhk.png 1920w\",style:{aspectRatio:\"1920 / 800\"},width:\"960\"}),/*#__PURE__*/e(\"h6\",{children:\"Effect of the mean parameter on the normal distribution.\"}),/*#__PURE__*/t(\"p\",{children:[\"However, it always allows room for negative values, no matter how much you push the mean parameter towards the positive side, as you see above. For this particular purpose the best fit is the \",/*#__PURE__*/e(\"em\",{children:\"log-normal\"}),\" family of distributions, the distribution of the logarithm of a normally distributed variable.\"]}),/*#__PURE__*/e(\"img\",{alt:\"Lognormal distributions\",className:\"framer-image\",height:\"540\",src:\"https://framerusercontent.com/images/H3ztOTJ2D1BdtlyS4Yjikfk7c.png\",srcSet:\"https://framerusercontent.com/images/H3ztOTJ2D1BdtlyS4Yjikfk7c.png?scale-down-to=512 512w,https://framerusercontent.com/images/H3ztOTJ2D1BdtlyS4Yjikfk7c.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/H3ztOTJ2D1BdtlyS4Yjikfk7c.png 1920w\",style:{aspectRatio:\"1920 / 1080\"},width:\"960\"}),/*#__PURE__*/t(\"h6\",{children:[\"Lognormal distributions. Via \",/*#__PURE__*/e(i,{href:\"https://commons.wikimedia.org/wiki/File:PDF-log_normal_distributions.svg\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!0,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"Wikimedia\"})}),\".\"]}),/*#__PURE__*/e(\"p\",{children:\"Plus, it has the advantage of being a little skewed towards the lower values, instead of being perfectly symmetric around the mean, which makes lower values more probable and hence is in better correspondence with the reality.\"}),/*#__PURE__*/t(\"p\",{children:[\"Thus, when the event happens, we can draw a value from the (one and only) lognormal distribution that has the 90% \",/*#__PURE__*/e(\"code\",{children:\"CI\"}),\" estimated by the experts, and call that the loss for that risk in that simulated year. We can do the same for other risks, add them all up and so get a global loss due to cybersecurity in that simulated year, thus obtaining a table similar to this one:\"]}),/*#__PURE__*/e(\"img\",{alt:\"Simulated losses\",className:\"framer-image\",height:\"540\",src:\"https://framerusercontent.com/images/PlrOBDb3MTgQwtVNb0UqH9UMOI.png\",srcSet:\"https://framerusercontent.com/images/PlrOBDb3MTgQwtVNb0UqH9UMOI.png?scale-down-to=512 512w,https://framerusercontent.com/images/PlrOBDb3MTgQwtVNb0UqH9UMOI.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/PlrOBDb3MTgQwtVNb0UqH9UMOI.png 1920w\",style:{aspectRatio:\"1920 / 1080\"},width:\"960\"}),/*#__PURE__*/e(\"h6\",{children:/*#__PURE__*/e(i,{href:\"https://www.howtomeasureanything.com/\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!0,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:'Simulated losses for every risk in a \"simulated year.\"'})})}),/*#__PURE__*/e(\"p\",{children:\"Notice how, given that the probabilities for each risk are small, none larger than 10%, most rows, most of the time, will display a loss of $0. Now the way to make this into a useful simulation is to run it many times and writing down the results, packed up into bins with which we could make a histogram, or better yet, a curve.\"}),/*#__PURE__*/e(\"img\",{alt:\"Monte Carlo results\",className:\"framer-image\",height:\"400\",src:\"https://framerusercontent.com/images/csrObFN9CoLoKlJpdr32y6yuIc.png\",srcSet:\"https://framerusercontent.com/images/csrObFN9CoLoKlJpdr32y6yuIc.png?scale-down-to=512 512w,https://framerusercontent.com/images/csrObFN9CoLoKlJpdr32y6yuIc.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/csrObFN9CoLoKlJpdr32y6yuIc.png 1920w\",style:{aspectRatio:\"1920 / 800\"},width:\"960\"}),/*#__PURE__*/t(\"h6\",{children:[/*#__PURE__*/e(i,{href:\"https://www.howtomeasureanything.com/\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!0,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"Monte Carlo results summary\"})}),\".\"]}),/*#__PURE__*/t(\"p\",{children:[\"From these results, we can build a \",/*#__PURE__*/e(i,{href:\"https://fluidattacks.com/blog/quantifying-risk/\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!1,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"loss exceedance curve\"})}),\", simply by counting the number of times the simulated results are higher than a threshold, and plotting the results:\"]}),/*#__PURE__*/e(\"img\",{alt:\"Loss exceedance curve\",className:\"framer-image\",height:\"350\",src:\"https://framerusercontent.com/images/htvdfPBpWqWOWu1vyjG8E0H0A.png\",srcSet:\"https://framerusercontent.com/images/htvdfPBpWqWOWu1vyjG8E0H0A.png?scale-down-to=512 512w,https://framerusercontent.com/images/htvdfPBpWqWOWu1vyjG8E0H0A.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/htvdfPBpWqWOWu1vyjG8E0H0A.png 1920w\",style:{aspectRatio:\"1920 / 700\"},width:\"960\"}),/*#__PURE__*/t(\"h6\",{children:[/*#__PURE__*/e(i,{href:\"https://www.howtomeasureanything.com/\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!0,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"Loss Exceedance Curve\"})}),\".\"]}),/*#__PURE__*/t(\"p\",{children:[\"The risk tolerance curve can be obtained from estimation as well, this time by appropriately interviewing an executive expert about the maximum chance with which they would be able to tolerate certain loss thresholds, plotting those risks on a graph, and fitting (\",/*#__PURE__*/e(i,{href:\"https://en.wikipedia.org/wiki/Interpolation\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!0,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"interpolating\"})}),\") a curve to these points:\"]}),/*#__PURE__*/e(\"img\",{alt:\"Fitting the curve\",className:\"framer-image\",height:\"312\",src:\"https://framerusercontent.com/images/Nb7EmYVUjmQtSlGa63yuVK0HYo.png\",srcSet:\"https://framerusercontent.com/images/Nb7EmYVUjmQtSlGa63yuVK0HYo.png?scale-down-to=512 512w,https://framerusercontent.com/images/Nb7EmYVUjmQtSlGa63yuVK0HYo.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/Nb7EmYVUjmQtSlGa63yuVK0HYo.png 1920w\",style:{aspectRatio:\"1920 / 624\"},width:\"960\"}),/*#__PURE__*/e(\"h6\",{children:\"Fitting the risk tolerance curve.\"}),/*#__PURE__*/t(\"p\",{children:[\"The \",/*#__PURE__*/e(\"em\",{children:\"residual risk curve\"}),\" corresponds to the probabilities obtained by the same method we used to generate the normal (\",/*#__PURE__*/e(\"em\",{children:\"inherent\"}),\") risk, only with different occurrence likelihoods estimated by a security expert. So we would just run the Monte Carlo simulation again, only this time with a 1% probability of a denial of service instead of the 15% we used before. Thus we would expect to obtain a curve whose loss probabilities are generally lower than the ones in the inherent risk curve:\"]}),/*#__PURE__*/e(\"img\",{alt:\"All together\",className:\"framer-image\",height:\"350\",src:\"https://framerusercontent.com/images/QS3iU41AqscA5BBQ1KGgizKiY.png\",srcSet:\"https://framerusercontent.com/images/QS3iU41AqscA5BBQ1KGgizKiY.png?scale-down-to=512 512w,https://framerusercontent.com/images/QS3iU41AqscA5BBQ1KGgizKiY.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/QS3iU41AqscA5BBQ1KGgizKiY.png 1920w\",style:{aspectRatio:\"1920 / 700\"},width:\"960\"}),/*#__PURE__*/t(\"h6\",{children:[/*#__PURE__*/e(i,{href:\"https://www.howtomeasureanything.com/\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!0,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"All together now\"})}),\".\"]}),/*#__PURE__*/t(\"p\",{children:[\"From these results it is now easier to quantify, compare and finally make a decision regarding which security control assets to invest in. From the Monte Carlo simulations, we could just average the losses to obtain the \",/*#__PURE__*/e(\"em\",{children:\"expected loss\"}),\". Suppose that is $10 million. Assume that a certain control, for example, setting up an Intrusion Detection System, makes the probability of the denial of service lower to 8%, and the probability of some of other events go down as well. If we run the simulation again, we will obtain a different, most likely lower, expected loss. Call it $8M, and suppose the \",/*#__PURE__*/e(\"code\",{children:\"IDS\"}),\" costs $0.5M. In that case we might say that the \",/*#__PURE__*/e(\"em\",{children:\"return on the control\"}),\" is given by\"]}),/*#__PURE__*/e(\"img\",{alt:\"Equation\",className:\"framer-image\",height:\"37\",src:\"https://framerusercontent.com/images/bMjMaVO0PDjXkG3baxHRw99xwIE.png\",srcSet:\"https://framerusercontent.com/images/bMjMaVO0PDjXkG3baxHRw99xwIE.png?scale-down-to=512 512w,https://framerusercontent.com/images/bMjMaVO0PDjXkG3baxHRw99xwIE.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/bMjMaVO0PDjXkG3baxHRw99xwIE.png 1920w\",style:{aspectRatio:\"1920 / 75\"},width:\"960\"}),/*#__PURE__*/e(\"h6\",{children:\"Return on control.\"}),/*#__PURE__*/e(\"p\",{children:\"Clearly, an investment that reduces the expected loss by four times its cost is clearly worth it. Try to compare that cost to having 2 red-colored risks and 3 yellow ones.\"}),/*#__PURE__*/t(\"p\",{children:[\"To recap, this loss exceedance curve is obtained by running several simulations which, in turn, feed from two expert estimates: the estimated cost of a security event, reported as a confidence interval, and the probability of an event occurring, given the context in which such \",/*#__PURE__*/e(i,{href:\"https://fluidattacks.com/blog/what-is-vulnerability-management/\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!1,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"a vulnerability would happen\"})}),\". The first can be easily estimated internally, but the second can only be determined from a thorough security audit and \",/*#__PURE__*/e(i,{href:\"https://fluidattacks.com/solutions/penetration-testing-as-a-service/\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!1,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"penetration testing\"})}),\". From the above numbers, which are of course made up, but not so out of this world, you can make a more informed decision regarding the investments your organization is willing to make regarding both offensive and defensive security. With the above tool, you have the gist to make these simulations yourself.\"]}),/*#__PURE__*/e(\"h2\",{children:\"References\"}),/*#__PURE__*/t(\"ul\",{children:[/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[\"D. Hubbard, R. Seiersen (2016). \",/*#__PURE__*/e(\"em\",{children:\"How to measure anything in cibersecurity risk\"}),\". \",/*#__PURE__*/e(i,{href:\"https://www.howtomeasureanything.com/\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!0,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"Wiley\"})}),\".\"]})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[\"S. Latchman (2010). \",/*#__PURE__*/e(\"em\",{children:\"Quantifying the Risk of Natural Catastrophes\"}),\". \",/*#__PURE__*/e(i,{href:\"https://understandinguncertainty.org/node/622\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!0,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"Understanding Uncertainty\"})}),\".\"]})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(i,{href:\"http://quantmleap.com/blog/2010/07/project-risk-management-and-the-application-of-monte-carlo-simulation/\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!0,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"quantmleap\"})}),\" (2010). \",/*#__PURE__*/e(\"em\",{children:\"Project Risk Management and the application of Monte Carlo Simulation\"}),\".\"]})})]})]});export const richText2=/*#__PURE__*/t(r.Fragment,{children:[/*#__PURE__*/t(\"p\",{children:[\"One of the least understood parts of a \",/*#__PURE__*/e(i,{href:\"https://fluidattacks.com/blog/what-is-vulnerability-management/\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!1,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"vulnerability\"})}),\" is the \",/*#__PURE__*/e(\"em\",{children:\"risk\"}),' it poses to the target. On the client side, it tends to get confused with impact and occurrence likelihood, due to devices like the so-called \"risk matrix,\" which are supposed to help us better understand risks:']}),/*#__PURE__*/e(\"img\",{alt:\"Risk matrices\",className:\"framer-image\",height:\"306\",src:\"https://framerusercontent.com/images/1RFPqWMuaHQcXoNhum2xQGM0R8.png\",srcSet:\"https://framerusercontent.com/images/1RFPqWMuaHQcXoNhum2xQGM0R8.png?scale-down-to=512 512w,https://framerusercontent.com/images/1RFPqWMuaHQcXoNhum2xQGM0R8.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/1RFPqWMuaHQcXoNhum2xQGM0R8.png 1920w\",style:{aspectRatio:\"1920 / 612\"},width:\"960\"}),/*#__PURE__*/t(\"h6\",{children:['Risk \"matrices\". Via ',/*#__PURE__*/e(i,{href:\"https://safestart.com/news/think-about-risk-adds-third-dimension-risk-matrix/\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!0,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"Safestart\"})}),\".\"]}),/*#__PURE__*/e(\"p\",{children:\"Discrete scales such as this have the obvious disadvantage that they can’t be added or mathematically operated with in a sensible way; they can be compared, but only crudely: how do 3 lows and 4 mediums compare to 2 highs? It is also hard to turn any of these into money terms.\"}),/*#__PURE__*/e(\"p\",{children:\"While in other sectors, like insurance and banking, risk is measured quantitatively and thus converted into dollars and cents, we are content with leaving the treatment of security threats, basically, to chance, by using these inaccurate scales for scoring risk.\"}),/*#__PURE__*/t(\"p\",{children:[\"But better methods exist in \",/*#__PURE__*/e(i,{href:\"https://en.wikipedia.org/wiki/Actuarial_science\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!0,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"actuarial science\"})}),\", statistics, \",/*#__PURE__*/e(i,{href:\"https://en.wikipedia.org/wiki/Game_theory\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!0,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"game theory\"})}),\", and \",/*#__PURE__*/e(i,{href:\"https://en.wikipedia.org/wiki/Decision_theory\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!0,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"decision theory\"})}),\", and they can be applied to measure cybersecurity risk.\"]}),/*#__PURE__*/e(\"p\",{children:\"Among the main reasons why these methods are not widely accepted in the field are:\"}),/*#__PURE__*/t(\"ul\",{children:[/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Security breaches are rare, so we can’t possibly have enough data to analyze. It wouldn’t be ``statistically significant''.\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"We do not see how we can measure risk, or even understand what measuring is nor what it is that we want to measure, nor how.\"})})]}),/*#__PURE__*/e(\"p\",{children:\"Before going into ground definitions, let me show you what we can achieve by applying quantitative methods to risk measurement:\"}),/*#__PURE__*/e(\"img\",{alt:\"Loss exceedance curve\",className:\"framer-image\",height:\"327\",src:\"https://framerusercontent.com/images/r0w3Q1RdyBtSW8mC9xZAOhVGL7c.png\",srcSet:\"https://framerusercontent.com/images/r0w3Q1RdyBtSW8mC9xZAOhVGL7c.png?scale-down-to=512 512w,https://framerusercontent.com/images/r0w3Q1RdyBtSW8mC9xZAOhVGL7c.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/r0w3Q1RdyBtSW8mC9xZAOhVGL7c.png 1920w\",style:{aspectRatio:\"1920 / 654\"},width:\"960\"}),/*#__PURE__*/t(\"h6\",{children:[\"Loss Exceedance Curve.\",/*#__PURE__*/e(i,{href:\"https://fluidattacks.com/blog/quantifying-risk/#r1\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!1,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"[1]\"})})]}),/*#__PURE__*/t(\"p\",{children:[\"This curve tells you the probability of losing any amount of money or more. Thus from the graph, we can read that the probability of losing $10 millions or more is around 40%, but losing more than $100 is unlikely at around 15%. You can enrich it with your \",/*#__PURE__*/e(\"em\",{children:\"risk tolerance\"}),\" (what is the probability that you can accept to lose \",/*#__PURE__*/e(\"em\",{children:\"n\"}),\" millions?) and the \",/*#__PURE__*/e(\"em\",{children:\"residual risk\"}),\" shows how the risk is mitigated by applying some controls. With this kind of tools, you can make more informed decisions regarding your security investments. If such a level of detail interests you, please read on.\"]}),/*#__PURE__*/e(\"h2\",{children:\"Measuring requires specification\"}),/*#__PURE__*/t(\"p\",{children:[\"First, we need to define \",/*#__PURE__*/e(\"em\",{children:\"what\"}),\" we want to measure. Is it possible to measure the impact of a breach on my company’s reputation? Is reputation even measurable? What makes some things measurable and others not? Well, we need to be able to assign a number to it. But also no measurement can represent reality or nature with 100% accuracy, so there must be some uncertainty in measurement. Uncertainty is \",/*#__PURE__*/e(\"em\",{children:\"inherent\"}),\" to measurement.\"]}),/*#__PURE__*/t(\"p\",{children:[\"In the lab, the length of an ant could be reported as 1.2 cm plus or minus 0.1 cm, which yields an \",/*#__PURE__*/e(\"em\",{children:\"interval\"}),\": the real size of the ant is somewhere between 1.1 and 1.3 cm. There might also be some error due to random mistakes or improper use of the measuring device, so we can assign a \",/*#__PURE__*/e(\"em\",{children:\"confidence\"}),\" of, say, 90%, to this measurement. Observations reduce the uncertainty in a quantitative way. At first, we might have estimated the length of the ant to be between, say, 0.5 and 3 centimeters, with 60% confidence. After measurement, we have less uncertainty.\"]}),/*#__PURE__*/t(\"p\",{children:[\"Thus, what we think is intangible or unmeasurable could actually be measured. Continuing with the reputation example, this might be measured indirectly by the drop in sales, or by the costs incurred in trying to repair the reputation damage. Another possibility for measuring could be \",/*#__PURE__*/e(\"em\",{children:\"decomposing\"}),\" the problem into smaller ones. For example, instead of trying to directly estimate the cost of a security breach, you might break it up into affectation to confidentiality, integrity, and availability. How many records could be stolen or wrongfully modified? What is each of them worth? For how long could our servers be out of service? How much money would be lost per hour?\"]}),/*#__PURE__*/e(\"p\",{children:'Furthermore, events like these need to be time-framed. It doesn’t make much sense to ask \"how likely is it that our organization suffers a major data breach?\" because, given unlimited time and resources, it is almost certain to happen. Plus, we probably don’t care if it were to happen eons from now. We need to set a reasonable time frame, like a year. Once we achieve a result such as'}),/*#__PURE__*/t(\"ul\",{children:[/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"There is a 40% chance of suffering a successful denial of service lasting more than 8 hours in the next year.\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"If such a denial of service happens, there is a 90% chance the loss will be between $2 and $5 million.\"})})]}),/*#__PURE__*/e(\"p\",{children:\"We could indirectly compute what might happen in 2 or any number of years.\"}),/*#__PURE__*/e(\"p\",{children:\"Finally, there is the issue of not having enough data to perform measurements or estimations, or rather, thinking we don’t have enough data. That is not the case or, if it were, then the established qualitative methods like assigning arbitrary names on a scale of 1 to 5, are just as inappropriate or more, actually introducing noise or error.\"}),/*#__PURE__*/e(\"h2\",{children:\"Subjective probability\"}),/*#__PURE__*/t(\"p\",{children:[\"The ultimate goal will be to perform a simulation of random events, also known as \",/*#__PURE__*/e(i,{href:\"https://fluidattacks.com/blog/monetizing-vulnerabilities/\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!1,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"Monte Carlo simulations\"})}),\". This type of simulation runs many times on single events, and their happening or not happening is based on a \",/*#__PURE__*/e(i,{href:\"https://www.investopedia.com/terms/p/probabilitydistribution.asp\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!0,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"probability distribution\"})}),\", and such distributions require parameters as input. These parameters usually determine the location and shape of the curve.\"]}),/*#__PURE__*/e(\"img\",{alt:\"Probability distributions\",className:\"framer-image\",height:\"317\",src:\"https://framerusercontent.com/images/xL15bNwDRZnqwOi9omMHkApX87M.png\",srcSet:\"https://framerusercontent.com/images/xL15bNwDRZnqwOi9omMHkApX87M.png?scale-down-to=512 512w,https://framerusercontent.com/images/xL15bNwDRZnqwOi9omMHkApX87M.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/xL15bNwDRZnqwOi9omMHkApX87M.png 1920w\",style:{aspectRatio:\"1920 / 634\"},width:\"960\"}),/*#__PURE__*/e(\"h6\",{children:\"Some probability distributions.\"}),/*#__PURE__*/e(\"p\",{children:\"These parameters are to be estimated by experts, just like they estimate risk on a scale from 1 to 5. Just as imprecise, perhaps, but the math performed with the distributions obtained from these parameters sort of rights the wrong in the initial guess. Actually, subjective probability estimation can be calibrated to a point where it can be done consistently and accurately.\"}),/*#__PURE__*/t(\"p\",{children:[\"Even if the estimates are completely wrong, the good thing is that they can be further refined by a simple rule from basic probability theory: \",/*#__PURE__*/e(i,{href:\"https://fluidattacks.com/blog/updating-belief/\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!1,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"Bayes rule\"})}),\". It involves the prior probabilities (i.e., our estimates or initial beliefs) and the posterior probabilities, the ones computed after observing a certain piece of evidence.\"]}),/*#__PURE__*/t(\"p\",{children:[\"Without going into details, which we will leave for the next articles, it can be shown that, from five expert inputs, including the probability of a successful \",/*#__PURE__*/e(i,{href:\"https://fluidattacks.com/blog/importance-pentesting/\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!1,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"penetration test\"})}),\", and the probability of remotely exploitable vulnerabilities when the pen test is positive, that in that case, the probability of suffering a major data breach can go from a prior of 1.24% goes up to a resounding 24%. If the test is negative, it goes down to 1.01%. This shows, by the way, the benefit of a proper \",/*#__PURE__*/e(i,{href:\"https://fluidattacks.com/solutions/penetration-testing-as-a-service/\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!1,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"pen test\"})}),\" regarding the value of information.\"]}),/*#__PURE__*/t(\"p\",{children:[\"Later we will also discuss more advanced methods based on Bayes rule such as \",/*#__PURE__*/e(i,{href:\"https://fluidattacks.com/blog/hit-miss/\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!1,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"iteratively adjusting distributions\"})}),\", which allows making forecasts with very scarce data, and decomposing probabilities with many conditions.\"]}),/*#__PURE__*/t(\"p\",{children:[\"This article merely pretended to be an introduction to the whole slew of methods that exist in other fields to estimate risk, uncertainty and the unknown, but have not been adopted in the field of cybersecurity. In \",/*#__PURE__*/e(i,{href:\"https://fluidattacks.com/blog/tags/risk/\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!1,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"upcoming articles\"})}),\", we will show in more detail how some of these methods work.\"]}),/*#__PURE__*/e(\"h2\",{children:\"References\"}),/*#__PURE__*/t(\"ol\",{children:[/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[\"R. Diesch, M. Pfaff, H. Kremar (2018). Prerequisite to measure information security in \",/*#__PURE__*/e(i,{href:\"https://www.scitepress.org/papers/2018/65456/65456.pdf\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!0,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"Proc. ICISSP 2018\"})}),\".\"]})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[\"B. Fischhoff, L. D. Phillips, and S. Lichtenstein (1982). Calibration of Probabilities: The State of the Art to 1980 in \",/*#__PURE__*/e(i,{href:\"https://link.springer.com/chapter/10.1007/978-94-010-1276-8_19\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!0,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/t(o.a,{children:[/*#__PURE__*/e(\"em\",{children:\"Judgement under Uncertainty: Heuristics and Biases\"}),\".\"]})})]})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[\"D. Hubbard, R. Seiersen (2016). \",/*#__PURE__*/e(\"em\",{children:\"How to measure anything in cibersecurity risk\"}),\". \",/*#__PURE__*/e(i,{href:\"https://www.howtomeasureanything.com/\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!0,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"Wiley\"})}),\".\"]})})]})]});export const richText3=/*#__PURE__*/t(r.Fragment,{children:[/*#__PURE__*/t(\"p\",{children:[\"While our main focus, as stated \",/*#__PURE__*/e(i,{href:\"https://fluidattacks.com/blog/machine-learning-hack/\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!1,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"previously\"})}),\", is to apply machine learning (ML) techniques to the \",/*#__PURE__*/e(i,{href:\"https://fluidattacks.com/products/secure-code-review\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!1,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"discovery of vulnerabilities in source code\"})}),\", that is, a \",/*#__PURE__*/e(\"em\",{children:\"white-box\"}),\" approach to ML-guided hacking, we’ve come across an interesting approach called \",/*#__PURE__*/e(i,{href:\"http://www.vdiscover.org/\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!0,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"VDiscover\"})}),\", which is radically different in the following sense:\"]}),/*#__PURE__*/t(\"ul\",{children:[/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Works on binaries. No source code required.\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Mixes dynamic and static detection.\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[\"Guides \",/*#__PURE__*/e(i,{href:\"https://fluidattacks.com/blog/infinite-monkey-fuzzer/\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!1,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"fuzzing campaigns\"})}),\".\"]})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Looks primarily for memory corruption.\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Is very lightweight, hence scalable.\"})})]}),/*#__PURE__*/t(\"p\",{children:[\"But perhaps the most distinguishing design feature of VDiscover is that it is trained and validated with test cases working on the same program, unlike other approaches which need to be trained with labeled samples of vulnerable code. In a nutshell, you tell VDiscover what happens when you fuzz the program with a certain input, you tell it that it crashes with some other input, and hundreds more inputs with their outputs, to complete its \",/*#__PURE__*/e(\"em\",{children:\"training\"}),\" phase, and later it will be able to predict which test cases are more likely to produce vulnerabilities in the \",/*#__PURE__*/e(\"em\",{children:\"recall\"}),\" phase. This process can be depicted as follows:\"]}),/*#__PURE__*/e(\"img\",{alt:\"Training and recall\",className:\"framer-image\",height:\"264\",src:\"https://framerusercontent.com/images/pIRv4yp1wtMtoLfIYpvbdp7Qqsc.png\",srcSet:\"https://framerusercontent.com/images/pIRv4yp1wtMtoLfIYpvbdp7Qqsc.png?scale-down-to=512 512w,https://framerusercontent.com/images/pIRv4yp1wtMtoLfIYpvbdp7Qqsc.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/pIRv4yp1wtMtoLfIYpvbdp7Qqsc.png 1919w\",style:{aspectRatio:\"1919 / 528\"},width:\"959\"}),/*#__PURE__*/t(\"h6\",{children:[\"Training (left) and recall (right) phases of VDiscover. Taken from \",/*#__PURE__*/e(i,{href:\"http://www.vdiscover.org/\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!0,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"their site\"})}),\".\"]}),/*#__PURE__*/t(\"p\",{children:[\"In this diagram, \",/*#__PURE__*/e(\"em\",{children:\"vulnerability discovery procedure\"}),\" means any of the tests we use daily to find security flaws, but especially black-box \",/*#__PURE__*/e(i,{href:\"https://fluidattacks.com/blog/infinite-monkey-fuzzer/\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!1,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"fuzzing\"})}),\" of binaries, concrete \",/*#__PURE__*/e(i,{href:\"https://fluidattacks.com/blog/symbolic-execution-mortals/\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!1,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:'symbolic (\"concolic\") testing'})}),\" and \",/*#__PURE__*/e(i,{href:\"https://fluidattacks.com/blog/pars-orationis-secura/\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!1,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"static\"})}),\" \",/*#__PURE__*/e(i,{href:\"https://fluidattacks.com/blog/importance-pentesting/\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!1,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"analysis\"})}),\" \",/*#__PURE__*/e(i,{href:\"https://fluidattacks.com/blog/replaced-machines/\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!1,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"tools\"})}),\" which, while prone to false positives, can still be useful to generate test cases or guide processes like this one.\"]}),/*#__PURE__*/e(\"p\",{children:\"Why use this tool if I still need to run my tool of choice to generate the test cases? Running these tools is expensive, in time, computing resources, human resources, all of which translates to money as well. Also it doesn’t scale well to huge projects like entire operating systems which consist of tens of thousands of packaged binaries. Why not just execute your test only on a thousand of them and let VDiscover predict the rest, to later focus only on the ones which are more likely to contain vulnerabilities? Sounds like a good deal to me!\"}),/*#__PURE__*/t(\"p\",{children:[\"Such a \",/*#__PURE__*/e(\"em\",{children:\"modus operandi\"}),\" is what makes VDiscover stand out among its peers, besides the fact that it is a proper, relatively mature open-source project, while other ML-guided vulnerability detectors are still in development or provide proof-of-concept programs.\"]}),/*#__PURE__*/e(\"p\",{children:\"Hence, in order to test VDiscover, we need to choose:\"}),/*#__PURE__*/t(\"ol\",{children:[/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"A particular kind of vulnerability. They choose heap and stack memory corruptions.\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"A special vulnerability detection procedure. They chose simple, one byte at a time, fuzzing of inputs.\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[\"A dataset. They chose one made up from 1039 taken from the \",/*#__PURE__*/e(i,{href:\"https://security-tracker.debian.org/tracker/\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!0,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"Debian Bug Tracker\"})}),\".\"]})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"The particular machine learning models to apply to the dataset, since VDiscover` is designed to work with more than one of those.\"})})]}),/*#__PURE__*/e(\"p\",{children:\"This particular combination of vulnerability and detection procedure has several advantages:\"}),/*#__PURE__*/t(\"ol\",{children:[/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[\"Both implicit and explicit hints to determine whether the vulnerability was triggered, like the stack protections provided by the \",/*#__PURE__*/e(i,{href:\"https://www.gnu.org/software/libc/\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!0,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"GNU C library\"})}),\" which abort the execution, or the usage of functions like \",/*#__PURE__*/e(\"code\",{children:\"strcpy\"}),\" and \",/*#__PURE__*/e(\"code\",{children:\"fread\"}),\".\"]})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"It is an important kind of vulnerability unto itself, since they might allow the attacker to execute arbitrary code in the host machine.\"})})]}),/*#__PURE__*/t(\"p\",{children:[\"However, in order to be able to recognize the hints to memory corruption mentioned above, first some features need to be extracted from the target of evaluation. Dynamic features are taken from the execution of test cases, while static features are extracted from the binary code itself. This is extra information to enrich the dataset, to \",/*#__PURE__*/e(i,{href:\"https://dl.acm.org/doi/10.1145/2857705.2857720\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!0,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:'\"provide a redundant'})}),' and robust similarity measure that a machine learning model can employ to predict whether a test case will be flagged as vulnerable or not\".']}),/*#__PURE__*/t(\"p\",{children:[\"They avoid building \",/*#__PURE__*/e(i,{href:\"https://fluidattacks.com/blog/exploit-code-graph/\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!1,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"graph representations of code\"})}),\" altogether, and instead settle on reading the \",/*#__PURE__*/e(i,{href:\"https://fluidattacks.com/blog/reversing-mortals/\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!1,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"disassembly of the code\"})}),\" at \",/*#__PURE__*/e(\"strong\",{children:\"random\"}),\", but many times, thus ensuring capturing pretty much all possible sequences of standard C library calls. On the other hand, dynamic features is simply a set consisting of a function call to the C standard library, with its arguments, and the final state of the process which may be exit, crash, abort, or timeout.\"]}),/*#__PURE__*/t(\"p\",{children:[\"Onward to training the machines! They used three different models: a \",/*#__PURE__*/e(i,{href:\"https://fluidattacks.com/blog/crash-course-machine-learning/#decision-trees-and-forests\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!1,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"random forest\"})}),\", a \",/*#__PURE__*/e(i,{href:\"https://en.wikipedia.org/wiki/Logistic_regression\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!0,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"logistic regression model\"})}),\", which can be thought of a particular case of their third model, the \",/*#__PURE__*/e(i,{href:\"https://fluidattacks.com/blog/crash-course-machine-learning/#artificial-neural-networks-and-deep-learning\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!1,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"multilayer perceptron\"})}),\" The dataset was divided into three disjoint sets for training, validation and testing, preprocessed with a combination of \",/*#__PURE__*/e(i,{href:\"https://fluidattacks.com/blog/natural-code/\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!1,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"n-grams\"})}),\" and \",/*#__PURE__*/e(\"code\",{children:\"word2vec\"}),\" encoding, and adjusted the training to compensate for \",/*#__PURE__*/e(\"em\",{children:\"class imbalance\"}),\" (an issue with data where the interesting cases are too scarce amongst regular ones).\"]}),/*#__PURE__*/t(\"p\",{children:[\"The concrete implementation was done in Python using the \",/*#__PURE__*/e(i,{href:\"https://scikit-learn.org/\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!0,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"scikit-learn\"})}),\" and \",/*#__PURE__*/e(i,{href:\"https://github.com/lisa-lab/pylearn2/\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!0,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"pylearn2\"})}),\" libraries. The most accurate classifier was the random forest trained with the dynamical features only, with a prediction error of 31%. This high error, while not critical, shows that there is plenty of room for improvement. Still, these are good results for what is apparently the only (up to its moment) ML-guided tool for vulnerability research in binaries. On the other hand, the results are not as spectacular in terms of producing previously unknown vulnerabilities. They merely tell us about possible memory corruptions in particular pieces of code and how likely they are to be exploitable.\"]}),/*#__PURE__*/e(\"p\",{children:\"Probable paths that the authors would have liked to follow were to implement convolutional neural networks, try different vulnerability discovery procedures, and, perhaps more likely to be promising, using tress representing the possible sequences of library calls, the part that was done randomly in this study. However, as was their purpose, they managed to show that it is actually feasible to learn to search for vulnerabilities in binaries at the operating system scale.\"})]});export const richText4=/*#__PURE__*/t(r.Fragment,{children:[/*#__PURE__*/t(\"p\",{children:[\"If we have learned anything so far in our quest to understand how \",/*#__PURE__*/e(i,{href:\"https://fluidattacks.com/blog/crash-course-machine-learning/\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!1,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"machine learning\"})}),\" (\",/*#__PURE__*/e(\"code\",{children:\"ML\"}),\") can be used to \",/*#__PURE__*/e(i,{href:\"https://fluidattacks.com/blog/machine-learning-hack/\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!1,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"detect vulnerabilities\"})}),\" in source code, it’s that what matters the most in this process are the different representations of source code which are later fed to the actual \",/*#__PURE__*/e(\"code\",{children:\"ML\"}),\" algorithms. Especially, that these representations should include both semantic and syntactic information about the code.\"]}),/*#__PURE__*/t(\"p\",{children:[\"Also, that one \",/*#__PURE__*/e(\"code\",{children:\"ML\"}),\" technique seems particularly promising, but hardly exploited, namely, deep learning. Methods such as \",/*#__PURE__*/e(i,{href:\"https://en.wikipedia.org/wiki/Recurrent_neural_network\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!0,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"Recurrent Neural Networks\"})}),\" (\",/*#__PURE__*/e(\"code\",{children:\"RNN\"}),\"), \",/*#__PURE__*/e(i,{href:\"https://en.wikipedia.org/wiki/Convolutional_neural_network\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!0,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"Convolutional Neural Networks\"})}),\" (\",/*#__PURE__*/e(\"code\",{children:\"CNN\"}),\"), and \",/*#__PURE__*/e(i,{href:\"https://en.wikipedia.org/wiki/Deep_belief_network\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!0,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"Deep Belief Networks\"})}),\" (\",/*#__PURE__*/e(\"code\",{children:\"DBN\"}),\") have been successful in image and natural language processing, but never applied to \",/*#__PURE__*/e(i,{href:\"https://fluidattacks.com/blog/what-is-vulnerability-management/\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!1,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"vulnerability discovery\"})}),\" in a systematic fashion.\"]}),/*#__PURE__*/t(\"p\",{children:[\"The aim of the project \",/*#__PURE__*/e(\"code\",{children:/*#__PURE__*/e(i,{href:\"https://github.com/SySeVR/SySeVR\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!0,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"SySeVR\"})})}),\" is to apply deep learning techniques to the discovery of software vulnerabilities in source code, considering not only the \",/*#__PURE__*/e(\"em\",{children:\"form\"}),\" (syntax) which might induce a vulnerability, but also the flow of data and control in the program. They also tried to produce results as finely granular as possible, i.e., tell us exactly at which line or function the flaw arises. If that’s not enough, they also promise to explain the cause of false positives, if there are any.\"]}),/*#__PURE__*/e(\"p\",{children:\"When working with images and pattern recognition, objects of interest have a natural representation as vectors, which are suitable for machine learning algorithms. In that case it is easy to propose where an object in the image might be: just take smaller pieces of the image, and test their inherent features such as texture and color to determine if they are or not what we want to detect.\"}),/*#__PURE__*/t(\"p\",{children:[\"In order to translate this idea to code, the authors can leverage well-known patterns in previously identified vulnerabilities. Simply patterns that might trigger dangerous situations, such as the use of \",/*#__PURE__*/e(\"code\",{children:\"malloc\"}),\" and pointers in \",/*#__PURE__*/e(\"code\",{children:\"C\"}),\", \",/*#__PURE__*/e(i,{href:\"https://fluidattacks.com/blog/pars-orationis-secura/\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!1,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"concatenating user input\"})}),\", \",/*#__PURE__*/e(i,{href:\"https://fluidattacks.com/blog/stand-shoulders-giants/\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!1,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"importing flawed libraries\"})}),\", etc. Anything that a regular \",/*#__PURE__*/e(i,{href:\"https://fluidattacks.com/blog/replaced-machines/\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!1,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"static analysis tool\"})}),\" might look for, but probably with false positives. They call these \",/*#__PURE__*/e(\"em\",{children:\"Syntactic Vulnerability Candidates\"}),\" (\",/*#__PURE__*/e(\"code\",{children:\"SyVC\"}),\"). These can be either a single token (\",/*#__PURE__*/e(\"code\",{children:\"malloc\"}),\") taken from the program’s \",/*#__PURE__*/e(i,{href:\"https://fluidattacks.com/blog/oracle-code/#databases-out-of-programs\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!1,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"Abstract Syntax Tree\"})}),\" or a set of tokens (\",/*#__PURE__*/e(\"code\",{children:\"memset(dataBuffer…​\"}),\") or a whole statement which involves one of the mentioned danger situations.\"]}),/*#__PURE__*/e(\"img\",{alt:\"comparison\",className:\"framer-image\",height:\"406\",src:\"https://framerusercontent.com/images/CIPAFwK3q3yvSuVsAyL3i9YA0.png\",srcSet:\"https://framerusercontent.com/images/CIPAFwK3q3yvSuVsAyL3i9YA0.png?scale-down-to=512 512w,https://framerusercontent.com/images/CIPAFwK3q3yvSuVsAyL3i9YA0.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/CIPAFwK3q3yvSuVsAyL3i9YA0.png 1920w\",style:{aspectRatio:\"1920 / 813\"},width:\"960\"}),/*#__PURE__*/e(\"h6\",{children:\"Comparing image vs. code recognition.\"}),/*#__PURE__*/t(\"p\",{children:[\"In order to avoid false positives, the next logical step is to use semantic information about the program, i.e., how data and control flows in it in order to expand our knowledge about what happens before and after executing a particular line of code. And where does this information lie? As we know by know, this can be found in the \",/*#__PURE__*/e(\"code\",{children:/*#__PURE__*/e(i,{href:\"https://fluidattacks.com/blog/exploit-code-graph/#combining-standard-code-representations\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!1,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"Control Flow\"})})}),/*#__PURE__*/e(i,{href:\"https://fluidattacks.com/blog/exploit-code-graph/#combining-standard-code-representations\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!1,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\" and \"})}),/*#__PURE__*/e(\"code\",{children:/*#__PURE__*/e(i,{href:\"https://fluidattacks.com/blog/exploit-code-graph/#combining-standard-code-representations\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!1,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"Program Dependency\"})})}),/*#__PURE__*/e(i,{href:\"https://fluidattacks.com/blog/exploit-code-graph/#combining-standard-code-representations\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!1,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\" graphs\"})}),'. Armed with these two graphs, one can find the whole \"influence zone\" of a particular token or line, with a technique they call ',/*#__PURE__*/e(\"em\",{children:\"program slicing\"}),\". Basically it means to take all nodes in the semantic graph representations that are reachable from the token of interest, the \",/*#__PURE__*/e(\"code\",{children:\"SyVC\"}),'. In other words, all lines of code that are executed before and after this particular token or are somehow altered if its value were to change. They call this a \"Semantic Vulnerability Candidate\". Usually if the ',/*#__PURE__*/e(\"code\",{children:\"SyVC\"}),\" is a whole function, then the corresponding \",/*#__PURE__*/e(\"code\",{children:\"SeVC\"}),\" will include all functions called by it and all the function that call it.\"]}),/*#__PURE__*/t(\"p\",{children:[\"The next problem to be solved is: Having already identified a piece of the program that might contain a vulnerability as a \",/*#__PURE__*/e(\"code\",{children:\"SeVC\"}),\", how do we encode that as a vector or something that can be understood by machine learning algorithms? The approach chosen by the authors is to first give generic names to all the functions and variables (thus sort of \",/*#__PURE__*/e(\"em\",{children:\"obfuscating\"}),\" it lightly), then perform a lexical analysis on it (i.e., breaking it up into symbols) and finally representing that strings as a bag of words, a procedure we have already referred to in past articles. A fixed length must be chosen and vectors that don’t fit must be padded or truncated, since the chosen neural networks take vectors of a fixed length as input. Here is a depiction of the process for a particular piece of code:\"]}),/*#__PURE__*/e(\"img\",{alt:\"Illustration of the process\",className:\"framer-image\",height:\"426\",src:\"https://framerusercontent.com/images/M18A9qUCZ91gwGVIttZiRtwUHho.png\",srcSet:\"https://framerusercontent.com/images/M18A9qUCZ91gwGVIttZiRtwUHho.png?scale-down-to=512 512w,https://framerusercontent.com/images/M18A9qUCZ91gwGVIttZiRtwUHho.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/M18A9qUCZ91gwGVIttZiRtwUHho.png 1920w\",style:{aspectRatio:\"1920 / 853\"},width:\"960\"}),/*#__PURE__*/e(\"h6\",{children:\"Illustration of the process.\"}),/*#__PURE__*/t(\"p\",{children:[\"All that remains is to train and test the neural networks. One of the goals of \",/*#__PURE__*/e(\"code\",{children:\"SySeVR\"}),\" was to be able to work with different types of networks. Six (!) different types of networks were implemented in \",/*#__PURE__*/e(\"code\",{children:\"Python\"}),\" with the \",/*#__PURE__*/e(i,{href:\"http://www.deeplearning.net/software/theano/\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!0,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"Theano\"})}),\" library: \",/*#__PURE__*/e(\"code\",{children:\"CNN\"}),\", \",/*#__PURE__*/e(\"code\",{children:\"DBN\"}),\", and four types of \",/*#__PURE__*/e(\"code\",{children:\"RNN\"}),\": (Bidirectional) \",/*#__PURE__*/e(i,{href:\"https://en.wikipedia.org/wiki/Long_short-term_memory\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!0,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"Long-short term memory\"})}),\" (\",/*#__PURE__*/e(\"code\",{children:\"(B)LSTM\"}),\") and (Bidirectional) \",/*#__PURE__*/e(i,{href:\"https://en.wikipedia.org/wiki/Gated_recurrent_unit\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!0,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"Gated Recurrent Unit\"})}),\" (\",/*#__PURE__*/e(\"code\",{children:\"(B)GRU\"}),\"). They validated their results against a vulnerability dataset combining \",/*#__PURE__*/e(\"code\",{children:/*#__PURE__*/e(i,{href:\"https://nvd.nist.gov/\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!0,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"NVD\"})})}),\" and \",/*#__PURE__*/e(i,{href:\"https://ws680.nist.gov/publication/get_pdf.cfm?pub_id=923127\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!0,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"`SARD\"})}),\", labeled either as vulnerable or not, ideally some with the corresponding diff and the vulnerability type.\"]}),/*#__PURE__*/t(\"p\",{children:[\"But which syntactic patterns to look for? Who will be the syntactic vulnerability candidates? For this, they used standard static detection tools such as \",/*#__PURE__*/e(\"code\",{children:/*#__PURE__*/e(i,{href:\"https://www.checkmarx.com/\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!0,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"Checkmarx\"})})}),\", \",/*#__PURE__*/e(\"code\",{children:/*#__PURE__*/e(i,{href:\"https://dwheeler.com/flawfinder/\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!0,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"Flawfinder\"})})}),\" and \",/*#__PURE__*/e(\"code\",{children:/*#__PURE__*/e(i,{href:\"https://security.web.cern.ch/security/recommendations/en/codetools/rats.shtml\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!0,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"RATS\"})})}),\". From these results, they decided to focus on four main vulnerability types, out of the 126 different \",/*#__PURE__*/e(\"em\",{children:\"kinds\"}),\" of vulnerabilities contained in the dataset:\"]}),/*#__PURE__*/t(\"ul\",{children:[/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[\"Insecure \",/*#__PURE__*/e(\"code\",{children:\"API\"}),\" usage, v.g. \",/*#__PURE__*/e(\"code\",{children:\"malloc\"}),\" without \",/*#__PURE__*/e(\"code\",{children:\"free\"}),\".\"]})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Array usage.\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Pointer usage\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Improper arithmetic expressions.\"})})]}),/*#__PURE__*/t(\"p\",{children:['For this particular \"experiment\", the graph code representations were obtained with the tool ',/*#__PURE__*/e(i,{href:\"http://mlsec.org/joern/\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!0,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"Joern\"})}),\" by Yamaguchi et al., a sister project of \",/*#__PURE__*/e(\"code\",{children:/*#__PURE__*/e(i,{href:\"https://fluidattacks.com/blog/anomaly-serial-killer-doll/\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!1,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"Chucky\"})})}),\" of sorts. The \",/*#__PURE__*/e(\"code\",{children:\"SeVC\"}),\" to vector encoding was performed with \",/*#__PURE__*/e(\"code\",{children:/*#__PURE__*/e(i,{href:\"https://radimrehurek.com/gensim/models/word2vec.html\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!0,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"word2vec\"})})}),\".\"]}),/*#__PURE__*/e(\"p\",{children:\"The results of the experiment can be summarized as follows:\"}),/*#__PURE__*/t(\"ul\",{children:[/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(\"code\",{children:\"BGRU\"}),\" networks appear to be the best fit for vulnerability discovery, as long as the training data is good. In general the effectiveness of deep neural networks is a open research problem.\"]})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"For any kind of neural network used, it is better to tailor them to the specific kind of vulnerability that is sought, rather than try to use a catch-all type of model.\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(\"code\",{children:\"SySeVR\"}),\" results are way better than those of current, commercial, well-established static detection tools such as mentioned \",/*#__PURE__*/e(\"code\",{children:\"Checkmarx\"}),\".\"]})})]}),/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(\"code\",{children:\"SySeVR\"}),\" was able to identify 15 vulnerabilities new to \",/*#__PURE__*/e(\"code\",{children:\"NVD\"}),\" in open source projects like \",/*#__PURE__*/e(\"code\",{children:\"Thunderbird\"}),\" and \",/*#__PURE__*/e(\"code\",{children:\"Seamonkey\"}),\", all of which were, as it should, \",/*#__PURE__*/e(i,{href:\"https://fluidattacks.com/blog/vulnerability-disclosure/\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!1,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"responsibly disclosed\"})}),\". Some of them got listed in \",/*#__PURE__*/e(\"code\",{children:\"CVE\"}),\". Others were silently patched by their manufacturers. These are, of course, the most important product of this idea and are summarized in the following table:\"]}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",height:\"300\",src:\"https://framerusercontent.com/images/0a9VNJgSdoBef51zqzfmH50WrY.png\",srcSet:\"https://framerusercontent.com/images/0a9VNJgSdoBef51zqzfmH50WrY.png?scale-down-to=512 512w,https://framerusercontent.com/images/0a9VNJgSdoBef51zqzfmH50WrY.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/0a9VNJgSdoBef51zqzfmH50WrY.png 1920w\",style:{aspectRatio:\"1920 / 600\"},width:\"960\"}),/*#__PURE__*/t(\"h6\",{children:[\"New vulnerabilities found by \",/*#__PURE__*/e(\"code\",{children:\"SySeVR\"}),\".\"]}),/*#__PURE__*/e(\"p\",{children:\"Thus, the idea of applying deep learning techniques to vulnerability discovery in source apparently does deliver the promised results. However as mentioned earlier, these are to be taken with a grain of salt, until the results are peer-reviewed and cross-validated by the academic and security communities, or, at least, by us.\"}),/*#__PURE__*/e(\"h2\",{children:\"Reference\"}),/*#__PURE__*/t(\"p\",{children:[\"Z. Li, D. Zou, Shouhuai X., H. Jin, Y. Zhu and Z. Chen (2018). \",/*#__PURE__*/e(\"em\",{children:\"SySeVR: A framework for using deep learning to detect software vulnerabilities\"}),\". \",/*#__PURE__*/e(\"code\",{children:/*#__PURE__*/e(i,{href:\"https://arxiv.org/pdf/1807.06756.pdf\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!0,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"arXiv:1807.06756 [cs.LG\"})})}),\"]\"]})]});export const richText5=/*#__PURE__*/e(r.Fragment,{children:/*#__PURE__*/t(\"p\",{children:[\"Functions! I’m sure you have heard this concept in many ways: math, programming, economics, etc. And they all can be reduced to the same basic thing: something that takes some inputs and produces some outputs. Math is the case here, however, there is a lot to add to that short definition, specially when we apply it to computer security, because despite you might be unaware, your security totally depend on a special kind of functions called \",/*#__PURE__*/e(\"code\",{children:/*#__PURE__*/e(i,{href:\"https://mathworld.wolfram.com/TrapdoorOne-WayFunction.html\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!0,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"Trapdoors\"})})}),'. Let’s talk about trapdoor functions and how they save you from \"letting the cat out\".']})});export const richText6=/*#__PURE__*/t(r.Fragment,{children:[/*#__PURE__*/e(\"p\",{children:\"When we talk about inputs producing an output we usually talk about the reverse process: given the outputs deduce the inputs, this is really useful in many applications…​ but not in security! knowing an input from an output is a serious problem, you will see why.\"}),/*#__PURE__*/t(\"p\",{children:[\"A \",/*#__PURE__*/e(\"code\",{children:\"Trapdoor\"}),' is essentially something taking an input and producing an output, but it is extremely difficult to do the reverse process, this is because to do so you need to know a \"secret\" called a private key and you have to be the luckiest guy in all universes to guess it or to guess the input.']}),/*#__PURE__*/e(\"p\",{children:\"Suppose:\"}),/*#__PURE__*/e(\"figure\",{className:\"framer-table-wrapper\",children:/*#__PURE__*/e(\"table\",{children:/*#__PURE__*/t(\"tbody\",{children:[/*#__PURE__*/e(\"tr\",{children:/*#__PURE__*/e(\"th\",{children:/*#__PURE__*/e(\"p\",{children:/*#__PURE__*/e(\"br\",{className:\"trailing-break\"})})})}),/*#__PURE__*/e(\"tr\",{children:/*#__PURE__*/e(\"td\",{children:/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(\"strong\",{children:\"P\"}),\" : Plain text data\",/*#__PURE__*/e(\"br\",{}),/*#__PURE__*/e(\"strong\",{children:\"E\"}),\" : Encrypted data\",/*#__PURE__*/e(\"br\",{}),/*#__PURE__*/e(\"strong\",{children:\"K\"}),\" : Secret key\"]})})})]})})}),/*#__PURE__*/t(\"p\",{children:[\"A \",/*#__PURE__*/e(\"code\",{children:\"Trapdoor\"}),\" is a function that encrypts with the properties:\"]}),/*#__PURE__*/e(\"figure\",{className:\"framer-table-wrapper\",children:/*#__PURE__*/e(\"table\",{children:/*#__PURE__*/t(\"tbody\",{children:[/*#__PURE__*/e(\"tr\",{children:/*#__PURE__*/e(\"th\",{children:/*#__PURE__*/e(\"p\",{children:/*#__PURE__*/e(\"br\",{className:\"trailing-break\"})})})}),/*#__PURE__*/e(\"tr\",{children:/*#__PURE__*/e(\"td\",{children:/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(\"strong\",{children:\"E\"}),\" = f(\",/*#__PURE__*/e(\"strong\",{children:\"P\"}),\") (Easy to do)\",/*#__PURE__*/e(\"br\",{}),/*#__PURE__*/e(\"strong\",{children:\"P\"}),\" = f-1(\",/*#__PURE__*/e(\"strong\",{children:\"E\"}),\") (Really hard to do!)\",/*#__PURE__*/e(\"br\",{}),/*#__PURE__*/e(\"strong\",{children:\"P\"}),\" = f-1(\",/*#__PURE__*/e(\"strong\",{children:\"E,K\"}),\") (Easy to do)\"]})})})]})})}),/*#__PURE__*/t(\"p\",{children:[\"Now, \",/*#__PURE__*/e(\"code\",{children:\"Trapdoors\"}),\" are not the same as the well known hash functions, hash functions are one-way functions as well, but they are not reversible by any means, whereas \",/*#__PURE__*/e(\"code\",{children:\"Trapdoors\"}),\" are reversible with the key. This is what makes them fundamental for \",/*#__PURE__*/e(\"code\",{children:\"Encryption\"}),\" of shared information.\"]}),/*#__PURE__*/t(\"p\",{children:[\"Your lifesaving, precious data is always put in a \",/*#__PURE__*/e(\"code\",{children:\"Trapdoor\"}),\", encrypted and transmitted and no one (except the possessor of the secret and the luckiest guy in all universes) can figure out the data.\"]}),/*#__PURE__*/e(\"h2\",{children:\"Symmetric and Asymmetric Encryption\"}),/*#__PURE__*/t(\"p\",{children:[\"When two ends have to exchange sensitive data, they must agree on the key they both use, this is called \",/*#__PURE__*/e(\"code\",{children:/*#__PURE__*/e(i,{href:\"https://hackernoon.com/symmetric-and-asymmetric-encryption-5122f9ec65b1\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!0,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"Symmetric Encryption\"})})}),\" where the same key is used to encrypt and to decrypt. This key has to be transmitted first for agreement before any other communication, but how can they prevent a third party sniffs and retrieve the key? they use a type of \",/*#__PURE__*/e(\"code\",{children:\"Encryption\"}),\" called \",/*#__PURE__*/e(\"code\",{children:\"Asymmetric Encryption\"}),\": It encrypts the data with one public key and decrypts it with a different private key\"]}),/*#__PURE__*/e(\"figure\",{className:\"framer-table-wrapper\",children:/*#__PURE__*/e(\"table\",{children:/*#__PURE__*/t(\"tbody\",{children:[/*#__PURE__*/e(\"tr\",{children:/*#__PURE__*/e(\"th\",{children:/*#__PURE__*/e(\"p\",{children:/*#__PURE__*/e(\"br\",{className:\"trailing-break\"})})})}),/*#__PURE__*/e(\"tr\",{children:/*#__PURE__*/e(\"td\",{children:/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(\"strong\",{children:\"Kp\"}),\" : Public key\",/*#__PURE__*/e(\"br\",{}),/*#__PURE__*/e(\"strong\",{children:\"Ks\"}),\" : Private key\"]})})})]})})}),/*#__PURE__*/e(\"p\",{children:\"The data is encrypted with\"}),/*#__PURE__*/e(\"figure\",{className:\"framer-table-wrapper\",children:/*#__PURE__*/e(\"table\",{children:/*#__PURE__*/t(\"tbody\",{children:[/*#__PURE__*/e(\"tr\",{children:/*#__PURE__*/e(\"th\",{children:/*#__PURE__*/e(\"p\",{children:/*#__PURE__*/e(\"br\",{className:\"trailing-break\"})})})}),/*#__PURE__*/e(\"tr\",{children:/*#__PURE__*/e(\"td\",{children:/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(\"strong\",{children:\"E\"}),\" = f(\",/*#__PURE__*/e(\"strong\",{children:\"P\"}),\",\",/*#__PURE__*/e(\"strong\",{children:\"Kp\"}),\")\"]})})})]})})}),/*#__PURE__*/e(\"p\",{children:\"And decrypted with\"}),/*#__PURE__*/e(\"figure\",{className:\"framer-table-wrapper\",children:/*#__PURE__*/e(\"table\",{children:/*#__PURE__*/t(\"tbody\",{children:[/*#__PURE__*/e(\"tr\",{children:/*#__PURE__*/e(\"th\",{children:/*#__PURE__*/e(\"p\",{children:/*#__PURE__*/e(\"br\",{className:\"trailing-break\"})})})}),/*#__PURE__*/e(\"tr\",{children:/*#__PURE__*/e(\"td\",{children:/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(\"strong\",{children:\"P\"}),\" = f-1(\",/*#__PURE__*/e(\"strong\",{children:\"E\"}),\",\",/*#__PURE__*/e(\"strong\",{children:\"Kp\"}),\")\"]})})})]})})}),/*#__PURE__*/t(\"p\",{children:[\"This \",/*#__PURE__*/e(\"code\",{children:\"Encryption\"}),\" is slow and it’s not commonly used in data transmission. It’s only used between parties to agree on a shared key that they use for \",/*#__PURE__*/e(\"code\",{children:\"Symmetric Encryption\"}),\" which is the one used for large data exchange as it’s faster. The shared key for \",/*#__PURE__*/e(\"code\",{children:\"Symmetric Encryption\"}),\" is transmitted over \",/*#__PURE__*/e(\"code\",{children:\"Asymmetric Encryption\"}),\" so no attacker can retrieve this symmetric key.\"]}),/*#__PURE__*/e(\"h2\",{children:\"RSA Encryption\"}),/*#__PURE__*/t(\"p\",{children:[\"Rivest, Shamir, Adleman, also know as \",/*#__PURE__*/e(\"code\",{children:/*#__PURE__*/e(i,{href:\"https://hackernoon.com/how-does-rsa-work-f44918df914b\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!0,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"RSA\"})})}),/*#__PURE__*/e(i,{href:\"https://hackernoon.com/how-does-rsa-work-f44918df914b\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!0,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\" algorithm\"})}),\" is the most common algorithm for \",/*#__PURE__*/e(\"code\",{children:\"Asymmetric Encryption\"}),\" and it’s based on a \",/*#__PURE__*/e(\"code\",{children:\"Trapdoor\"}),\" function called \",/*#__PURE__*/e(\"em\",{children:\"modular exponentiation\"}),\" :\"]}),/*#__PURE__*/e(\"figure\",{className:\"framer-table-wrapper\",children:/*#__PURE__*/e(\"table\",{children:/*#__PURE__*/t(\"tbody\",{children:[/*#__PURE__*/e(\"tr\",{children:/*#__PURE__*/e(\"th\",{children:/*#__PURE__*/e(\"p\",{children:/*#__PURE__*/e(\"br\",{className:\"trailing-break\"})})})}),/*#__PURE__*/e(\"tr\",{children:/*#__PURE__*/e(\"td\",{children:/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(\"strong\",{children:\"E\"}),\" = \",/*#__PURE__*/e(\"strong\",{children:\"PKP\"}),\" mod \",/*#__PURE__*/e(\"strong\",{children:\"N\"})]})})})]})})}),/*#__PURE__*/t(\"p\",{children:[\"In this case knowing \",/*#__PURE__*/e(\"strong\",{children:\"P\"}),\" from \",/*#__PURE__*/e(\"strong\",{children:\"E\"}),\" is impossible, you need to know a secret \",/*#__PURE__*/e(\"strong\",{children:\"KS\"}),\" in order to compute it.\"]}),/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(\"code\",{children:\"RSA\"}),\" algorithm uses prime number arithmetics and modular exponentiation to encrypt a message, the algorithm can be summarized like this :\"]}),/*#__PURE__*/t(\"ol\",{children:[/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[\"Choose two prime numbers \",/*#__PURE__*/e(\"em\",{children:/*#__PURE__*/e(\"strong\",{children:\"p\"})}),\" and \",/*#__PURE__*/e(\"em\",{children:/*#__PURE__*/e(\"strong\",{children:\"q\"})}),\".\"]})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[\"Compute \",/*#__PURE__*/e(\"em\",{children:/*#__PURE__*/e(\"strong\",{children:\"n\"})}),\" = \",/*#__PURE__*/e(\"em\",{children:/*#__PURE__*/e(\"strong\",{children:\"pq\"})}),\".\"]})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[\"Compute \",/*#__PURE__*/e(i,{href:\"https://en.wikipedia.org/wiki/Euler%27s_totient_function\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!0,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"Euler’s function\"})}),\" \",/*#__PURE__*/e(\"em\",{children:/*#__PURE__*/e(\"strong\",{children:\"ϕ\"})}),\" = (\",/*#__PURE__*/e(\"em\",{children:/*#__PURE__*/e(\"strong\",{children:\"p\"})}),/*#__PURE__*/e(\"strong\",{children:\" - 1\"}),\")(\",/*#__PURE__*/e(\"em\",{children:/*#__PURE__*/e(\"strong\",{children:\"q\"})}),/*#__PURE__*/e(\"strong\",{children:\" - 1\"}),\").\"]})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[\"Choose a number \",/*#__PURE__*/e(\"em\",{children:/*#__PURE__*/e(\"strong\",{children:\"e\"})}),\" smaller and \",/*#__PURE__*/e(i,{href:\"https://simple.wikipedia.org/wiki/Coprime\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!0,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:/*#__PURE__*/e(\"em\",{children:\"coprime\"})})}),\" to \",/*#__PURE__*/e(\"em\",{children:/*#__PURE__*/e(\"strong\",{children:\"ϕ\"})}),\".\"]})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[\"Choose a number \",/*#__PURE__*/e(\"em\",{children:/*#__PURE__*/e(\"strong\",{children:\"d\"})}),\" such that (\",/*#__PURE__*/e(\"em\",{children:/*#__PURE__*/e(\"strong\",{children:\"ed\"})}),/*#__PURE__*/e(\"strong\",{children:\" - 1\"}),\") mod \",/*#__PURE__*/e(\"em\",{children:/*#__PURE__*/e(\"strong\",{children:\"ϕ\"})}),/*#__PURE__*/e(\"strong\",{children:\" = 0\"}),\", This is know as the \",/*#__PURE__*/e(i,{href:\"https://en.wikipedia.org/wiki/Modular_multiplicative_inverse\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!0,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:/*#__PURE__*/e(\"em\",{children:\"modular multiplicative inverse\"})})}),\", in other words, \",/*#__PURE__*/e(\"em\",{children:/*#__PURE__*/e(\"strong\",{children:\"ed\"})}),/*#__PURE__*/e(\"strong\",{children:\" - 1\"}),\" must be divisible entirely by \",/*#__PURE__*/e(\"em\",{children:/*#__PURE__*/e(\"strong\",{children:\"ϕ\"})}),\".\"]})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[\"(\",/*#__PURE__*/e(\"em\",{children:/*#__PURE__*/e(\"strong\",{children:\"e\"})}),\",\",/*#__PURE__*/e(\"em\",{children:/*#__PURE__*/e(\"strong\",{children:\"n\"})}),\") are the public key whereas (\",/*#__PURE__*/e(\"em\",{children:/*#__PURE__*/e(\"strong\",{children:\"s\"})}),\",\",/*#__PURE__*/e(\"em\",{children:/*#__PURE__*/e(\"strong\",{children:\"n\"})}),\") are the private key.\"]})})]}),/*#__PURE__*/t(\"p\",{children:[\"A message \",/*#__PURE__*/e(\"em\",{children:/*#__PURE__*/e(\"strong\",{children:\"m\"})}),\" is encrypted into \",/*#__PURE__*/e(\"em\",{children:/*#__PURE__*/e(\"strong\",{children:\"c\"})}),\" by\"]}),/*#__PURE__*/e(\"figure\",{className:\"framer-table-wrapper\",children:/*#__PURE__*/e(\"table\",{children:/*#__PURE__*/t(\"tbody\",{children:[/*#__PURE__*/e(\"tr\",{children:/*#__PURE__*/e(\"th\",{children:/*#__PURE__*/e(\"p\",{children:/*#__PURE__*/e(\"br\",{className:\"trailing-break\"})})})}),/*#__PURE__*/e(\"tr\",{children:/*#__PURE__*/e(\"td\",{children:/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(\"em\",{children:/*#__PURE__*/e(\"strong\",{children:\"c\"})}),\" = \",/*#__PURE__*/e(\"em\",{children:/*#__PURE__*/e(\"strong\",{children:\"me\"})}),\" mod \",/*#__PURE__*/e(\"em\",{children:/*#__PURE__*/e(\"strong\",{children:\"n\"})})]})})})]})})}),/*#__PURE__*/e(\"p\",{children:\"And decrypted by\"}),/*#__PURE__*/e(\"figure\",{className:\"framer-table-wrapper\",children:/*#__PURE__*/e(\"table\",{children:/*#__PURE__*/t(\"tbody\",{children:[/*#__PURE__*/e(\"tr\",{children:/*#__PURE__*/e(\"th\",{children:/*#__PURE__*/e(\"p\",{children:/*#__PURE__*/e(\"br\",{className:\"trailing-break\"})})})}),/*#__PURE__*/e(\"tr\",{children:/*#__PURE__*/e(\"td\",{children:/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(\"em\",{children:/*#__PURE__*/e(\"strong\",{children:\"m\"})}),\" = \",/*#__PURE__*/e(\"em\",{children:/*#__PURE__*/e(\"strong\",{children:\"cd\"})}),\" mod \",/*#__PURE__*/e(\"em\",{children:/*#__PURE__*/e(\"strong\",{children:\"n\"})})]})})})]})})}),/*#__PURE__*/t(\"p\",{children:[\"Thus, anyone can know the public key value \",/*#__PURE__*/e(\"em\",{children:/*#__PURE__*/e(\"strong\",{children:\"e\"})}),\" to encrypt but not the private key value \",/*#__PURE__*/e(\"em\",{children:/*#__PURE__*/e(\"strong\",{children:\"d\"})}),\" used to decrypt. What about \",/*#__PURE__*/e(\"em\",{children:/*#__PURE__*/e(\"strong\",{children:\"n\"})}),\" ? could not they use it to come up with \",/*#__PURE__*/e(\"em\",{children:/*#__PURE__*/e(\"strong\",{children:\"d\"})}),\" ? Yes, they can, they will just take tenths of years to do it as \",/*#__PURE__*/e(\"em\",{children:/*#__PURE__*/e(\"strong\",{children:\"n\"})}),\" is chosen to be a very big number, so breaking it into the prime factors \",/*#__PURE__*/e(\"em\",{children:/*#__PURE__*/e(\"strong\",{children:\"p\"})}),\", \",/*#__PURE__*/e(\"em\",{children:/*#__PURE__*/e(\"strong\",{children:\"q\"})}),\" used to get \",/*#__PURE__*/e(\"em\",{children:/*#__PURE__*/e(\"strong\",{children:\"e\"})}),\" and therefore \",/*#__PURE__*/e(\"em\",{children:/*#__PURE__*/e(\"strong\",{children:\"d\"})}),\", would take long enough that an attacker cannot crack the key.\"]}),/*#__PURE__*/e(\"h2\",{children:\"AES Encryption\"}),/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(\"code\",{children:/*#__PURE__*/e(i,{href:\"https://thebestvpn.com/advanced-encryption-standard-aes/\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!0,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"AES\"})})}),/*#__PURE__*/e(i,{href:\"https://thebestvpn.com/advanced-encryption-standard-aes/\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!0,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\" (Advanced Encryption System) algorithm\"})}),\", is usually the chosen one for \",/*#__PURE__*/e(\"code\",{children:\"Symmetric Encryption\"}),\". This algorithm is rather procedural than hard mathematical formula computation, it basically encrypts a table of data in four steps:\"]}),/*#__PURE__*/t(\"ol\",{children:[/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(\"code\",{children:\"SubBytes\"}),\" : Each value in a table is substituted by another using a table.\"]})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(\"code\",{children:\"ShiftRows\"}),\" : Rows of the table are shifted by some offset.\"]})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(\"code\",{children:\"MixColumns\"}),\" : Columns are mixed by a matrix operation.\"]})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(\"code\",{children:\"AddRoundKey\"}),\" : The public key is performed over the table with an \",/*#__PURE__*/e(\"code\",{children:\"XOR\"}),\" operation.\"]})})]}),/*#__PURE__*/e(\"p\",{children:\"All operations performed are reversible and they are made in order to eliminate or diffuse any possible pattern or relationship of the ciphered message to the original one and to the key that might hint an attack.\"}),/*#__PURE__*/e(\"h2\",{children:\"Conclusion\"}),/*#__PURE__*/t(\"p\",{children:[\"You can be sure your data is very well protected and that the communication won’t be disclosed to any attacker thanks to a \",/*#__PURE__*/e(\"code\",{children:\"Trapdoor\"}),\", of course, as computing power continues to develop, we might need to create new traps, but now the assurance of your privacy on communication is really high, so every time you browse your social networks, bank accounts, etc; remember there is a \",/*#__PURE__*/e(\"code\",{children:\"Trapdoor\"}),\" that won’t let any cat out.\"]})]});export const richText7=/*#__PURE__*/t(r.Fragment,{children:[/*#__PURE__*/e(\"p\",{children:\"In an era where IT companies and business services are diverse, realizing which companies have the best performance on service delivery is crucial when buying services from companies that guarantee their expertise.\"}),/*#__PURE__*/e(\"p\",{children:\"Having this in mind, Clutch (a renowned platform that connects buyers with IT companies) has announced their selection of top leading service companies and IT companies worldwide in 2018.\"}),/*#__PURE__*/e(\"p\",{children:\"Fluid Attacks was recognized as a global leader on Cybersecurity category by Clutch, positioning it as one of the most relevant companies in this industry.\"})]});export const richText8=/*#__PURE__*/t(r.Fragment,{children:[/*#__PURE__*/e(\"p\",{children:\"Clutch runs a sophisticated model in which variables like client reviews, past work, market presence, and specialization in a given service, amongst other factors, correlate in order to obtain the results of this ranking.\"}),/*#__PURE__*/e(\"p\",{children:\"At this moment, Fluid Attacks is located alongside matrix leaders at the seventh position among 15 companies.\"}),/*#__PURE__*/e(\"p\",{children:\"Throughout the whole year, Clutch has included Fluid Attacks into the top ten companies in their field.\"}),/*#__PURE__*/e(\"img\",{alt:\"Clutch leaders matrix\",className:\"framer-image\",height:\"515\",src:\"https://framerusercontent.com/images/JiuKF067bQ6ybRIuS6o0g4t578.png\",srcSet:\"https://framerusercontent.com/images/JiuKF067bQ6ybRIuS6o0g4t578.png?scale-down-to=512 512w,https://framerusercontent.com/images/JiuKF067bQ6ybRIuS6o0g4t578.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/JiuKF067bQ6ybRIuS6o0g4t578.png 1919w\",style:{aspectRatio:\"1919 / 1031\"},width:\"959\"}),/*#__PURE__*/t(\"p\",{children:[\"Fluid Attacks focuses more on its value offer, resigning other activities within its market segment, looking to achieve its purpose; \",/*#__PURE__*/e(\"strong\",{children:\"Find all vulnerabilities and report back as soon as possible.\"})]}),/*#__PURE__*/e(\"p\",{children:\"By seeing this, Fluid Attacks understands that it is on the right track when it comes to assess the risks in our clients information security.\"}),/*#__PURE__*/e(\"p\",{children:\"We are proud of this mention, and it encourages us to maintain this level and keep improving every day.\"}),/*#__PURE__*/e(\"h2\",{children:\"References\"}),/*#__PURE__*/t(\"ul\",{children:[/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:/*#__PURE__*/e(i,{href:\"https://clutch.co/press-releases/announces-it-business-service-companies-global-2018\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!0,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"Clutch Announces IT and Business Service Companies as Global Leaders 2018\"})})})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:/*#__PURE__*/e(i,{href:\"https://clutch.co/it-services/cybersecurity/leaders-matrix\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!0,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"Top Cybersecurity Consulting Companies\"})})})})]})]});export const richText9=/*#__PURE__*/t(r.Fragment,{children:[/*#__PURE__*/t(\"p\",{children:[\"In our \",/*#__PURE__*/e(i,{href:\"https://fluidattacks.com/blog/exploit-code-graph/\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!1,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"previous article\"})}),\" we focused on \",/*#__PURE__*/e(\"em\",{children:\"taint-style\"}),\" vulnerabilities, i.e., those that are essentially due to the lack of input sanitization which allows \",/*#__PURE__*/e(\"em\",{children:\"tainted\"}),\", user-controlled data to reach sensitive functions. Some of these arise due to \",/*#__PURE__*/e(\"em\",{children:\"missing checks\"}),\" in code, such as:\"]}),/*#__PURE__*/t(\"ul\",{children:[/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"failure to check authentication, authorization or other conditions related to the security logic of the application,\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[\"insecure \",/*#__PURE__*/e(\"code\",{children:\"API\"}),\" usage, like not checking the buffer size, leaving files open, not freeing memory after allocating, etc.\"]})})]}),/*#__PURE__*/t(\"p\",{children:[\"In production-grade systems, however, these checks are routinely performed since experienced developers are used to them. Still, taint-style vulnerabilities happen, as was the case with a \",/*#__PURE__*/e(\"code\",{children:\"Java 7 runtime\"}),\" vulnerability (\",/*#__PURE__*/e(i,{href:\"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2013-0422\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!0,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"CVE-2013-0422\"})}),\") which allowed arbitrary classes to be uploaded, leading to a massive distribution of malware. But when taint-style vulnerabilities do occur, they are certainly \",/*#__PURE__*/e(\"em\",{children:\"anomalies\"}),\". Thus, searching for this kind of situation (in mature software systems) is a problem for which \",/*#__PURE__*/e(i,{href:\"https://fluidattacks.com/blog/machine-learning-hack/#anomaly-detection-approaches\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!1,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"anomaly detection\"})}),\" \",/*#__PURE__*/e(i,{href:\"https://fluidattacks.com/blog/crash-course-machine-learning/#anomaly-detection-via-k-nearest-neighbors\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!1,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"machine learning\"})}),\" algorithms lend themselves well.\"]}),/*#__PURE__*/t(\"p\",{children:[\"Given a function, \",/*#__PURE__*/e(\"code\",{children:\"Chucky\"}),\" finds all the sources and sinks referenced by it. If you’ve been following our \",/*#__PURE__*/e(i,{href:\"https://fluidattacks.com/blog/tags/machine-learning/\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!1,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"latest articles\"})}),\", it should come as no surprise that the first step in the procedure is to perform a \",/*#__PURE__*/e(\"em\",{children:\"robust\"}),\" \",/*#__PURE__*/e(i,{href:\"https://fluidattacks.com/blog/pars-orationis-secura/\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!1,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"parsing\"})}),\".\"]}),/*#__PURE__*/t(\"p\",{children:[\"Notice the use of the word \",/*#__PURE__*/e(\"em\",{children:\"robust\"}),\" above: as opposed to the strict parsing done by linters and compilers, which fails at the first mistake, this type of parsing requires neither a proper build environment nor even complete or correct code.\"]}),/*#__PURE__*/e(\"p\",{children:\"Next, for each source or sink detected in the previous steps, the following steps are performed:\"}),/*#__PURE__*/t(\"ol\",{children:[/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Neighborhood discovery: identify the element’s context.\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Lightweight tainting: analyze the flow of data in the program.\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Embed the functions into a vector space. Needed to apply any machine learning algorithm.\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[\"Perform anomaly detection via a simple score when comparing to the \",/*#__PURE__*/e(\"em\",{children:\"k\"}),\" nearest neighbors.\"]})})]}),/*#__PURE__*/e(\"img\",{alt:\"Anomaly detection process\",className:\"framer-image\",height:\"150\",src:\"https://framerusercontent.com/images/QPAdWXfMQh9nAm6Olg3wZBd09o.png\",srcSet:\"https://framerusercontent.com/images/QPAdWXfMQh9nAm6Olg3wZBd09o.png?scale-down-to=512 512w,https://framerusercontent.com/images/QPAdWXfMQh9nAm6Olg3wZBd09o.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/QPAdWXfMQh9nAm6Olg3wZBd09o.png 1920w\",style:{aspectRatio:\"1920 / 300\"},width:\"960\"}),/*#__PURE__*/t(\"h6\",{children:[\"Overview of the anomaly detection process. Taken from \",/*#__PURE__*/e(i,{href:\"https://intellisec.de/pubs/2013-ccs.pdf\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!0,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"Yamaguchi et al. (2013)\"})}),\".\"]}),/*#__PURE__*/t(\"p\",{children:[\"In order to determine functions similar to the current one, the \",/*#__PURE__*/e(\"em\",{children:\"bag of words\"}),\" approach from the field of \",/*#__PURE__*/e(i,{href:\"https://en.wikipedia.org/wiki/Natural_language_processing\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!0,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"natural language processing\"})}),' is used. A coarse way to represent a document is by just counting word frequencies, and forgetting about all structure, syntax, etc. In this fashion, this and other articles in this blog would have high frequencies for words like \"security\" and \"',/*#__PURE__*/e(i,{href:\"https://fluidattacks.com/cybersecurity-essentials/what-is-vulnerability-management/\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!1,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"vulnerability\"})}),'\", but low ones for \"coffee\" and \"recipe\". This is a (perhaps too) simple, yet effective, way to distinguish security blogs from coffee-lovers blogs, but maybe it wouldn’t be able to distinguish sites which sell coffee from those who grow it.']}),/*#__PURE__*/t(\"p\",{children:['In order to avoid a situation where very common words with little significance like \"a\", \"in\", etc, rank too high, the ',/*#__PURE__*/e(\"em\",{children:\"inverse document frequency\"}),\" is used. Multiplying the relative term frequency by the inverse document frequency gives a lower ranking to words like the above and higher ranks to the rare ones, so as to strike a balance.\"]}),/*#__PURE__*/t(\"p\",{children:[\"The result of applying this, to every function in the code to analyze, is that every function is represented as a vector. Thus, distances between them can be computed, and its \",/*#__PURE__*/e(i,{href:\"https://fluidattacks.com/blog/crash-course-machine-learning/#anomaly-detection-via-k-nearest-neighbors\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!1,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/t(o.a,{children:[/*#__PURE__*/e(\"em\",{children:\"k\"}),\" nearest neighbors\"]})}),\" chosen as that function’s neighborhood. Intuitively, this should couple every function with the \",/*#__PURE__*/e(\"em\",{children:\"k\"}),\" most similar functions in terms of the \",/*#__PURE__*/e(\"code\",{children:\"API\"}),\" symbols they use. Thus, functions that use a lot of memory allocations would be put together, a method that has many return points would be paired with functions that also have many return points, etc.\"]}),/*#__PURE__*/t(\"p\",{children:[\"Other than knowing which functions are similar to the one under scrutiny, we also need to know which checks or conditionals are really security-relevant, and which ones are just noise. This, however, is not so easy since we need to take into account the flow of data between variables, which sounds more like a job for \",/*#__PURE__*/e(i,{href:\"https://fluidattacks.com/blog/symbolic-execution-mortals/\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!1,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"symbolic execution\"})}),\" and taint analysis, which is in fact what \",/*#__PURE__*/e(\"code\",{children:\"Chucky\"}),\" uses.\"]}),/*#__PURE__*/e(\"img\",{alt:\"Tainted dependency graph\",className:\"framer-image\",height:\"300\",src:\"https://framerusercontent.com/images/0TwKlsq3XAhOVf9rF7DINCX5wUk.png\",srcSet:\"https://framerusercontent.com/images/0TwKlsq3XAhOVf9rF7DINCX5wUk.png?scale-down-to=512 512w,https://framerusercontent.com/images/0TwKlsq3XAhOVf9rF7DINCX5wUk.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/0TwKlsq3XAhOVf9rF7DINCX5wUk.png 1920w\",style:{aspectRatio:\"1920 / 600\"},width:\"960\"}),/*#__PURE__*/e(\"h6\",{children:\"Tainted dependency graph (right) for the snippet to the left.\"}),/*#__PURE__*/e(\"p\",{children:\"This graph is then traversed both in the source-to-sink and sink-to-source direction to determine tainted identifiers, highlighted in gray above.\"}),/*#__PURE__*/t(\"p\",{children:[\"Next we need to represent the function as a vector. Again, the authors use a bag-of-words-like approach, where instead of the term frequency or inverse document frequency, a simple \",/*#__PURE__*/e(\"em\",{children:\"indicator\"}),\" function is used: \",/*#__PURE__*/e(\"code\",{children:\"1\"}),\" if a term is contained and \",/*#__PURE__*/e(\"code\",{children:\"0\"}),\" if not. Furthermore, the \",/*#__PURE__*/e(\"em\",{children:'\"words\"'}),\" are taken from the abstract syntax tree and later normalized since we don’t care about particular operations (\",/*#__PURE__*/e(\"code\",{children:\"<\"}),\", \",/*#__PURE__*/e(\"code\",{children:\">\"}),\" are all treated as comparisons), particular numbers used or particular identifier names. Thus, from the snippet above, we would obtain a vector representation such as this one:\"]}),/*#__PURE__*/e(\"img\",{alt:\"AST\",className:\"framer-image\",height:\"159\",src:\"https://framerusercontent.com/images/kb4olrfoV2Nt1HeCPQi4DZcx1I.png\",srcSet:\"https://framerusercontent.com/images/kb4olrfoV2Nt1HeCPQi4DZcx1I.png?scale-down-to=512 512w,https://framerusercontent.com/images/kb4olrfoV2Nt1HeCPQi4DZcx1I.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/kb4olrfoV2Nt1HeCPQi4DZcx1I.png 1918w\",style:{aspectRatio:\"1918 / 319\"},width:\"959\"}),/*#__PURE__*/e(\"h6\",{children:\"AST, normalization and embedding of the above snippet.\"}),/*#__PURE__*/e(\"p\",{children:'Now we can extract a model of \"normality\" for every source or sink of interest in every function. This is defined as the center of mass (essentially an average) of all the vector representations taken over the set of neighbors of the function that contains the source or sink of interest. This is still a vector, and each of its components tells us the fraction of neighbors that contain a particular check.'}),/*#__PURE__*/t(\"p\",{children:[\"Subtracting the vector representation of a function from this model of normality also gives us some insight. Negative entries in this difference vector correspond to expressions checked in this function, but not so much in its neighbors, while positive entries show the opposite: checks that are commonly performed by syntactically similar functions but are \",/*#__PURE__*/e(\"em\",{children:\"missing\"}),\" in this particular function, i.e., the \",/*#__PURE__*/e(\"em\",{children:\"missing checks\"}),\" that we sought from the beginning. An anomaly score can be given to each function as the maximum element in the vector, given that functions which are mostly similar to their neighbors, except for one missing check, are more likely to contain security vulnerabilities than functions which are just altogether different from their neighbors.\"]}),/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(\"code\",{children:\"Chucky\"}),\" was originally tested on five popular open-source projects, versions of which contained published missing-check \",/*#__PURE__*/e(\"code\",{children:\"CVEs\"}),\". Also, the code was modified to introduce artificial vulnerabilities. This, of course, depends on the number of neighbors that should be taken into account. The results of this experiment to determine its capability to find known vulnerabilities are summarized below:\"]}),/*#__PURE__*/e(\"img\",{alt:\"Artificial test results\",className:\"framer-image\",height:\"455\",src:\"https://framerusercontent.com/images/lHYrwu8fVrcDQYFveCCTMLQHwI.png\",srcSet:\"https://framerusercontent.com/images/lHYrwu8fVrcDQYFveCCTMLQHwI.png?scale-down-to=512 512w,https://framerusercontent.com/images/lHYrwu8fVrcDQYFveCCTMLQHwI.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/lHYrwu8fVrcDQYFveCCTMLQHwI.png 1920w\",style:{aspectRatio:\"1920 / 910\"},width:\"960\"}),/*#__PURE__*/t(\"p\",{children:[\"Artificial test results for \",/*#__PURE__*/e(\"code\",{children:\"Chucky\"}),\".\"]}),/*#__PURE__*/t(\"p\",{children:[\"Notice that with 25 neighbors the results are perfect, i.e. no false positives and complete recall. For other reasonable values of \",/*#__PURE__*/e(\"em\",{children:\"k\"}),\" the results are also good.\"]}),/*#__PURE__*/t(\"p\",{children:[\"But can it help in finding \",/*#__PURE__*/e(\"em\",{children:\"previously unknown\"}),\" vulnerabilities, as was set in the authors objectives? Indeed, \",/*#__PURE__*/e(\"code\",{children:\"Chucky\"}),\" was able to find 12 zero-day vulnerabilities in \",/*#__PURE__*/e(\"code\",{children:\"LibTIFF\"}),\" and \",/*#__PURE__*/e(\"code\",{children:\"Pidgin\"}),\". One of them is particularly easy to exploit. In the function \",/*#__PURE__*/e(\"code\",{children:\"msn_message_parse_payload\"}),\", \",/*#__PURE__*/e(\"code\",{children:\"Chucky\"}),\" reports a failure to check the value passed to \",/*#__PURE__*/e(\"code\",{children:\"strchr\"}),\". An attacker can thus trigger this vulnerability by sending the message \",/*#__PURE__*/e(\"code\",{children:\"Content-Type\\\\n\\\\n\"}),\", thus making one of the sensitive sinks on the victim side \",/*#__PURE__*/e(\"code\",{children:\"null\"}),\", leading to an application crash.\"]}),/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(\"code\",{children:\"Chucky\"}),' has shown us how relatively simple, but \"intellectually transparent\" machine learning models can tell us a lot about where to look for vulnerabilities. However, let us remember that this approach is not free of false positives and also that it doesn’t pretend to replace human auditing, only to accelerate it by aiding us in not having to ',/*#__PURE__*/e(i,{href:\"https://fluidattacks.com/products/secure-code-review\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!1,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"review code\"})}),\" that is most likely safe.\"]})]});export const richText10=/*#__PURE__*/e(r.Fragment,{children:/*#__PURE__*/t(\"p\",{children:[\"As we have seen in our previous \",/*#__PURE__*/e(i,{href:\"https://fluidattacks.com/blog/machine-learning-hack/\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!1,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"revision article\"})}),\", probably the most interesting and successful approach to automated vulnerability detection is the \",/*#__PURE__*/e(i,{href:\"https://fluidattacks.com/blog/machine-learning-hack/#pattern-recognition-approaches\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!1,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"pattern-based approach\"})}),'. Since we expect to extract meaningful patterns from the code, we also need a \"',/*#__PURE__*/e(i,{href:\"https://ieeexplore.ieee.org/document/6956589\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!0,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"comprehensive and feature-rich representation\"})}),'\" of it. Other authors have tried to work on the code as if it were merely a collection of words or documents with no regards to syntax or inherent order, but with poor results.']})});export const richText11=/*#__PURE__*/t(r.Fragment,{children:[/*#__PURE__*/e(\"h2\",{children:\"Combining standard code representations\"}),/*#__PURE__*/t(\"p\",{children:[\"The basic idea is to parse the source code, represent it as a graph which extends on the standard \",/*#__PURE__*/e(i,{href:\"https://fluidattacks.com/blog/oracle-code/#databases-out-of-programs\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!1,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"abstract syntax tree\"})}),\" (\",/*#__PURE__*/e(\"code\",{children:\"AST\"}),\") to include information about data and control flow, and store it in a database which can be queried by the analyst.\"]}),/*#__PURE__*/e(\"img\",{alt:\"Overview\",className:\"framer-image\",height:\"170\",src:\"https://framerusercontent.com/images/RNpAi1HIt1SMR1spi2Wb4LlzTWw.png\",srcSet:\"https://framerusercontent.com/images/RNpAi1HIt1SMR1spi2Wb4LlzTWw.png?scale-down-to=512 512w,https://framerusercontent.com/images/RNpAi1HIt1SMR1spi2Wb4LlzTWw.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/RNpAi1HIt1SMR1spi2Wb4LlzTWw.png 1920w\",style:{aspectRatio:\"1920 / 340\"},width:\"960\"}),/*#__PURE__*/e(\"h6\",{children:\"Overview of the process.\"}),/*#__PURE__*/t(\"p\",{children:[\"Besides the \",/*#__PURE__*/e(\"code\",{children:\"AST\"}),\", another couple of useful code representations are:\"]}),/*#__PURE__*/t(\"ul\",{children:[/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[\"the \",/*#__PURE__*/e(\"em\",{children:\"control flow\"}),\" graph (\",/*#__PURE__*/e(\"code\",{children:\"CFG\"}),\"), which represents the order in which statements are executed depending on the conditions, and\"]})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[\"the \",/*#__PURE__*/e(\"em\",{children:\"program dependence\"}),\" graph (\",/*#__PURE__*/e(\"code\",{children:\"PDG\"}),\"), which tells us how variables are modified by statements.\"]})})]}),/*#__PURE__*/t(\"p\",{children:[\"These are better understood by example. Consider the following \",/*#__PURE__*/e(\"code\",{children:\"C\"}),\" snippet:\"]}),/*#__PURE__*/e(\"div\",{className:\"framer-text-module\",style:{height:\"auto\",width:\"100%\"},children:/*#__PURE__*/e(n,{componentIdentifier:\"module:pVk4QsoHxASnVtUBp6jr/HTBsNkEMAb7TUGaO3DBy/CodeBlock.js:default\",children:t=>/*#__PURE__*/e(a,{...t,code:\"void foo() {\\n  int x = source();\\n  if( x < MAX ) {\\n    int y = 2*x;\\n    sink(y);\\n  }\\n}\",language:\"C\"})})}),/*#__PURE__*/t(\"p\",{children:[\"In this context, \",/*#__PURE__*/e(\"em\",{children:\"source\"}),\" is meant to be the place in the code where the variables might be tainted by the attacker, and \",/*#__PURE__*/e(\"em\",{children:\"sink\"}),\" is meant to be the function which might be vulnerable if the input from the source is not sanitized. The \",/*#__PURE__*/e(\"code\",{children:\"AST\"}),\", \",/*#__PURE__*/e(\"code\",{children:\"CFG\"}),\", and \",/*#__PURE__*/e(\"code\",{children:\"PDG\"}),\" for such a snippet would look like this:\"]}),/*#__PURE__*/e(\"img\",{alt:\"Comparison of representations\",className:\"framer-image\",height:\"300\",src:\"https://framerusercontent.com/images/Y3No2D7e3QD29UulgZ5y0PoQnA.png\",srcSet:\"https://framerusercontent.com/images/Y3No2D7e3QD29UulgZ5y0PoQnA.png?scale-down-to=512 512w,https://framerusercontent.com/images/Y3No2D7e3QD29UulgZ5y0PoQnA.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/Y3No2D7e3QD29UulgZ5y0PoQnA.png 1920w\",style:{aspectRatio:\"1920 / 600\"},width:\"960\"}),/*#__PURE__*/e(\"h6\",{children:\"Comparison of graph representations of code.\"}),/*#__PURE__*/t(\"p\",{children:[\"Neither of them, alone, can tell us the whole story about what is happening in that snippet, which is, of course, necessary to \",/*#__PURE__*/e(i,{href:\"https://fluidattacks.com/blog/what-is-vulnerability-management/\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!1,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"identify vulnerabilities\"})}),\", since these are generally very context-dependent.\"]}),/*#__PURE__*/t(\"p\",{children:[\"Yamaguchi and his team put forward the idea of combining these three graphs into a single \",/*#__PURE__*/e(i,{href:\"https://en.wikipedia.org/wiki/Multigraph\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!0,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:/*#__PURE__*/e(\"em\",{children:\"multigraph\"})})}),\" (basically a graph that allows multiple edges for a pair of nodes) which they call the \",/*#__PURE__*/e(\"em\",{children:\"code property graph\"}),\":\"]}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",height:\"200\",src:\"https://framerusercontent.com/images/4SDvdcOkA7jPHLL865Kxf5X9SX4.png\",srcSet:\"https://framerusercontent.com/images/4SDvdcOkA7jPHLL865Kxf5X9SX4.png?scale-down-to=512 512w,https://framerusercontent.com/images/4SDvdcOkA7jPHLL865Kxf5X9SX4.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/4SDvdcOkA7jPHLL865Kxf5X9SX4.png 1920w\",style:{aspectRatio:\"1920 / 400\"},width:\"960\"}),/*#__PURE__*/e(\"h6\",{children:\"A code property graph.\"}),/*#__PURE__*/t(\"p\",{children:[\"Essentially, it’s like the \",/*#__PURE__*/e(\"code\",{children:\"AST\"}),' with additional edges \"borrowed\" from the ',/*#__PURE__*/e(\"code\",{children:\"PDG\"}),\" and \",/*#__PURE__*/e(\"code\",{children:\"CFG\"}),\", and are represented with different colors and labels. The authors provide detailed explanations regarding how these graphs are mathematically defined, operationally built from source and later traversed. However, here we will continue using only the intuition of how this works, with the discovery of a \",/*#__PURE__*/e(i,{href:\"https://www.owasp.org/index.php/Buffer_Overflow\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!0,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"Buffer Overflow\"})}),\" vulnerability in the \",/*#__PURE__*/e(\"code\",{children:\"Apple\"}),\" implementation of \",/*#__PURE__*/e(\"code\",{children:\"SSH\"}),\" which exposed many \",/*#__PURE__*/e(\"code\",{children:\"iOS\"}),\" applications. This is the culprit code:\"]}),/*#__PURE__*/e(\"div\",{className:\"framer-text-module\",style:{height:\"auto\",width:\"100%\"},children:/*#__PURE__*/e(n,{componentIdentifier:\"module:pVk4QsoHxASnVtUBp6jr/HTBsNkEMAb7TUGaO3DBy/CodeBlock.js:default\",children:t=>/*#__PURE__*/e(a,{...t,code:'if channelp {\\n uint32_t namelen = _libssh2_ntohu32(data ` 9 ` sizeof(\"exit-signal\"));\\n channelp->exit_signal = LIBSSH2_ALLOC(session, namelen + 1);\\n [...]\\n memcpy(channelp->exit_signal, data ` 13 ` sizeof(\"exit_signal\"), namelen);\\n channelp->exit_signal[namelen] = \\'\\\\0\\';\\n}',language:\"C\"})})}),/*#__PURE__*/t(\"p\",{children:[\"Memory is allocated in line \",/*#__PURE__*/e(\"code\",{children:\"3\"}),\" using the \",/*#__PURE__*/e(\"code\",{children:\"LIBSSH2_ALLOC\"}),\" function depending on the variable \",/*#__PURE__*/e(\"code\",{children:\"namelen\"}),\". The problem is that this variable is controlled by the user, so if it is made large enough, we have a buffer overflow which might give the attacker control of the program execution. The vulnerability was originally discovered using a regular expression which looks for a pattern where the use of functions containing \",/*#__PURE__*/e(\"code\",{children:\"ALLOC\"}),\" is combined with arithmetical operations:\"]}),/*#__PURE__*/e(\"div\",{className:\"framer-text-module\",style:{height:\"auto\",width:\"100%\"},children:/*#__PURE__*/e(n,{componentIdentifier:\"module:pVk4QsoHxASnVtUBp6jr/HTBsNkEMAb7TUGaO3DBy/CodeBlock.js:default\",children:t=>/*#__PURE__*/e(a,{...t,code:\"ALLOC[A-Z0-9_]*\\\\s*\\\\([^,]*,[^;]*[*+-][^>][^;]*\\\\)\\\\s*;\",language:\"Markdown\"})})}),/*#__PURE__*/t(\"p\",{children:[\"However, \",/*#__PURE__*/e(i,{href:\"https://fluidattacks.com/blog/pars-orationis-secura/#specifying-the-targets\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!1,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"as we know\"})}),\", regular expressions fail to match the nested structure of code, miss the whole context behind a potentially interesting situation and are prone to false positives. Instead, a \",/*#__PURE__*/e(\"em\",{children:\"traversal\"}),\" over the code property graph can be defined which selects third arguments to \",/*#__PURE__*/e(\"code\",{children:\"memcpy\"}),\" which have been tainted by first arguments to \",/*#__PURE__*/e(\"code\",{children:\"get_user\"}),\" that have not been sanitized.\"]}),/*#__PURE__*/t(\"p\",{children:[\"By manually crafting such graph traversals, the authors were able to identify \",/*#__PURE__*/e(\"strong\",{children:\"88\"}),\" vulnerabilities in the \",/*#__PURE__*/e(\"code\",{children:\"Linux\"}),\" kernel. Out of those, these 18 were previously unknown:\"]}),/*#__PURE__*/e(\"img\",{alt:\"Identified vulnerabilities\",className:\"framer-image\",height:\"300\",src:\"https://framerusercontent.com/images/5BSAbkh8La5vSZqYKiqSlQ1DVJc.png\",srcSet:\"https://framerusercontent.com/images/5BSAbkh8La5vSZqYKiqSlQ1DVJc.png?scale-down-to=512 512w,https://framerusercontent.com/images/5BSAbkh8La5vSZqYKiqSlQ1DVJc.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/5BSAbkh8La5vSZqYKiqSlQ1DVJc.png 1920w\",style:{aspectRatio:\"1920 / 600\"},width:\"960\"}),/*#__PURE__*/t(\"h6\",{children:[\"Zero-day vulnerabilities found using \",/*#__PURE__*/e(\"code\",{children:\"CPG\"}),\".\"]}),/*#__PURE__*/t(\"p\",{children:[\"That’s 15 \",/*#__PURE__*/e(\"code\",{children:\"CVEs\"}),\" right there, made with a graph representation of code and four measly traversals.\"]}),/*#__PURE__*/e(\"h2\",{children:\"Automating traversals\"}),/*#__PURE__*/t(\"p\",{children:[\"However good the results, they wouldn’t be pertinent for our research purposes if they couldn’t be automated using machine learning (\",/*#__PURE__*/e(\"code\",{children:\"ML\"}),\"). Since we already know how to traverse the \",/*#__PURE__*/e(\"code\",{children:\"CPG\"}),\" to look for potentially dangerous patterns, now we need a way to automatically infer what those patterns are.\"]}),/*#__PURE__*/t(\"p\",{children:[\"The procedure proposed by Yamaguchi et al. is not universal though, as it does not apply to all kinds of vulnerabilities, but to those of the \",/*#__PURE__*/e(\"em\",{children:\"taint-style\"}),\", like \",/*#__PURE__*/e(i,{href:\"https://fluidattacks.com/blog/my-heart-bleeds/\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!1,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"Heartbleed\"})}),\". Furthermore, it is not entirely automated, i.e., don’t expect to give it your code and obtain every bug. Rather, you have to feed it a sink of interest, such as \",/*#__PURE__*/e(\"code\",{children:\"memcpy\"}),\", whose unsanitized use caused \",/*#__PURE__*/e(\"code\",{children:\"Heartbleed\"}),\".\"]}),/*#__PURE__*/t(\"p\",{children:[\"Having selected a sink, we find all invocations of it and \",/*#__PURE__*/e(\"em\",{children:\"slice\"}),\" the whole part of the program that involves the sink, and we represent that as a graph. This graph is then divided into individual calls. This information is then encoded as features, i.e., mapped to a vector space, which is a precondition to applying any \",/*#__PURE__*/e(\"code\",{children:\"ML\"}),\" algorithm. Then, these invocations are \",/*#__PURE__*/e(i,{href:\"https://fluidattacks.com/blog/crash-course-machine-learning/#k-means-clustering\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!1,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"clustered\"})}),\" to determine sets of invocations with similar argument initializers. However, this is not enough, as some of those arguments could be sanitized. Thus, the second to last step is to create a \",/*#__PURE__*/e(\"em\",{children:\"sanitization overlay\"}),\", in order to avoid false positives. Here is a depiction of the process:\"]}),/*#__PURE__*/e(\"img\",{alt:\"Clustering\",className:\"framer-image\",height:\"200\",src:\"https://framerusercontent.com/images/3woDTBOSg3T44jUf4D4icrfB9s.png\",srcSet:\"https://framerusercontent.com/images/3woDTBOSg3T44jUf4D4icrfB9s.png?scale-down-to=512 512w,https://framerusercontent.com/images/3woDTBOSg3T44jUf4D4icrfB9s.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/3woDTBOSg3T44jUf4D4icrfB9s.png 1920w\",style:{aspectRatio:\"1920 / 400\"},width:\"960\"}),/*#__PURE__*/e(\"h6\",{children:\"Clustering to get traversals.\"}),/*#__PURE__*/t(\"p\",{children:[\"The product of this process is a set of graph database traversals such as the ones described in the previous section. These traversals follow a template written in the \",/*#__PURE__*/e(i,{href:\"http://tinkerpop.apache.org/\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!0,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"Gremlin\"})}),\" graph query language:\"]}),/*#__PURE__*/e(\"p\",{children:/*#__PURE__*/e(\"strong\",{children:\"Template for traversals.\"})}),/*#__PURE__*/e(\"div\",{className:\"framer-text-module\",style:{height:\"auto\",width:\"100%\"},children:/*#__PURE__*/e(n,{componentIdentifier:\"module:pVk4QsoHxASnVtUBp6jr/HTBsNkEMAb7TUGaO3DBy/CodeBlock.js:default\",children:t=>/*#__PURE__*/e(a,{...t,code:\"getCallsTo(sink)\\n  .taintedArgs(\\n          [arg1Source, ..., argnSource]\\n  ).unchecked(\\n          [arg1Sanitizer, ..., argnSanitizer)\\n  )\",language:\"C\"})})}),/*#__PURE__*/t(\"p\",{children:[\"This method was checked against five well-known vulnerable sinks in five different open source projects with good results. In this case, the quality of results is measured by the \",/*#__PURE__*/e(\"em\",{children:\"reduction\"}),\" made to manual code auditing, which is above \",/*#__PURE__*/e(\"code\",{children:\"90%\"}),\" for all of them. They also tried to generate a traversal that would be able to detect the \",/*#__PURE__*/e(i,{href:\"https://fluidattacks.com/blog/my-heart-bleeds/\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!1,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"Heartbleed\"})}),\" vulnerability in the \",/*#__PURE__*/e(\"code\",{children:\"OpenSSL\"}),\", and a general test on all potentially taintable sinks in the \",/*#__PURE__*/e(\"code\",{children:\"VLC\"}),\" media player, discovering \",/*#__PURE__*/e(\"code\",{children:\"8\"}),\" previously unknown vulnerabilities.\"]}),/*#__PURE__*/t(\"p\",{children:[\"This was an interesting combination of the \",/*#__PURE__*/e(i,{href:\"https://fluidattacks.com/blog/oracle-code/\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!1,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"code-as-data\"})}),\" approach and \",/*#__PURE__*/e(i,{href:\"https://fluidattacks.com/blog/crash-course-machine-learning/\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!1,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"machine learning\"})}),\" techniques to \",/*#__PURE__*/e(i,{href:\"https://fluidattacks.com/blog/secure-code-review/\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!1,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"find vulnerabilities in source code\"})}),\" (see our \",/*#__PURE__*/e(i,{href:\"https://fluidattacks.com/solutions/secure-code-review/\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!1,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"secure code review solution\"})}),\"). However, many details are missing in the pattern-based approach to \",/*#__PURE__*/e(\"code\",{children:\"ML\"}),\" -guided vulnerability discovery. In particular, we have yet to discuss \",/*#__PURE__*/e(\"em\",{children:\"vulnerability extrapolation\"}),\" using dimensionality reduction and \",/*#__PURE__*/e(\"em\",{children:\"missing check\"}),\" detection via \",/*#__PURE__*/e(i,{href:\"https://fluidattacks.com/blog/crash-course-machine-learning/#anomaly-detection-via-k-nearest-neighbors\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!1,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"anomaly detection.\"})}),\" Stay tuned for more details on applying this, and other \",/*#__PURE__*/e(\"code\",{children:\"ML\"}),\" techniques to security.\"]}),/*#__PURE__*/e(\"h2\",{children:\"References\"}),/*#__PURE__*/t(\"ol\",{children:[/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[\"Yamaguchi, F., Golde, N., Arp, D., and Rieck, K. (2014). \",/*#__PURE__*/e(i,{href:\"https://ieeexplore.ieee.org/document/6956589\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!0,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"Modeling and discovering vulnerabilities with code property graphs.\"})}),\" In \",/*#__PURE__*/e(\"em\",{children:\"Proc. of IEEE Symposium on Security and Privacy (S&P)\"}),\".\"]})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[\"Yamaguchi, F., Maier, A., Gascon, H., and Rieck, K. (2015). \",/*#__PURE__*/e(i,{href:\"https://www.researchgate.net/publication/279961337_Automatic_Inference_of_Search_Patterns_for_Taint-Style_Vulnerabilities\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!0,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"Automatic inference of search patterns for taint-style vulnerabilities.\"})}),\" In \",/*#__PURE__*/e(\"em\",{children:\"Proc. of IEEE Symposium on Security and Privacy (S&P)\"}),\".\"]})})]})]});export const richText12=/*#__PURE__*/t(r.Fragment,{children:[/*#__PURE__*/t(\"p\",{children:[\"In this article, we clarify some of the undefined terms in our \",/*#__PURE__*/e(i,{href:\"https://fluidattacks.com/blog/machine-learning-hack/\",motionChild:!0,nodeId:\"WJBZI1Ghk\",openInNewTab:!1,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"previous article\"})}),\" and thereby explore a selection of machine learning algorithms and their applications to information security.\"]}),/*#__PURE__*/t(\"p\",{children:[\"This is not meant to be an exhaustive list of all machine learning (\",/*#__PURE__*/e(\"code\",{children:\"ML\"}),\") algorithms and techniques. We would like, however, to demistify some obscure concepts and dethrone a few buzzwords. Hence, this article is far from neutral.\"]})]});\nexport const __FramerMetadata__ = {\"exports\":{\"richText8\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"richText3\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"richText10\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"richText4\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"richText6\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"richText9\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"richText7\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"richText\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"richText5\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"richText11\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"richText2\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"richText12\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"richText1\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}"],"mappings":"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"}