Congratulations!

[Valid RSS] This is a valid RSS feed.

Recommendations

This feed is valid, but interoperability with the widest range of feed readers could be improved by implementing the following recommendations.

Source: https://github.blog/feed/

  1. <?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
  2. xmlns:content="http://purl.org/rss/1.0/modules/content/"
  3. xmlns:wfw="http://wellformedweb.org/CommentAPI/"
  4. xmlns:dc="http://purl.org/dc/elements/1.1/"
  5. xmlns:atom="http://www.w3.org/2005/Atom"
  6. xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
  7. xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
  8. xmlns:georss="http://www.georss.org/georss"
  9. xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#"
  10. >
  11.  
  12. <channel>
  13. <title>The GitHub Blog</title>
  14. <atom:link href="https://github.blog/feed/" rel="self" type="application/rss+xml" />
  15. <link>https://github.blog/</link>
  16. <description>Updates, ideas, and inspiration from GitHub to help developers build and design software.</description>
  17. <lastBuildDate>Wed, 01 May 2024 16:34:54 +0000</lastBuildDate>
  18. <language>en-US</language>
  19. <sy:updatePeriod>
  20. hourly </sy:updatePeriod>
  21. <sy:updateFrequency>
  22. 1 </sy:updateFrequency>
  23. <generator>https://wordpress.org/?v=6.5.2</generator>
  24.  
  25. <image>
  26. <url>https://github.blog/wp-content/uploads/2019/01/cropped-github-favicon-512.png?fit=32%2C32</url>
  27. <title>The GitHub Blog</title>
  28. <link>https://github.blog/</link>
  29. <width>32</width>
  30. <height>32</height>
  31. </image>
  32. <site xmlns="com-wordpress:feed-additions:1">153214340</site> <item>
  33. <title>Empowering accessibility: GitHub&#8217;s journey building an in-house Champions program</title>
  34. <link>https://github.blog/2024-05-01-empowering-accessibility-githubs-journey-building-an-in-house-champions-program/</link>
  35. <dc:creator><![CDATA[Carie Fisher]]></dc:creator>
  36. <pubDate>Wed, 01 May 2024 17:00:13 +0000</pubDate>
  37. <category><![CDATA[Company]]></category>
  38. <category><![CDATA[accessibility]]></category>
  39. <category><![CDATA[Global Accessibility Awareness Day]]></category>
  40. <category><![CDATA[How GitHub builds GitHub]]></category>
  41. <guid isPermaLink="false">https://github.blog/?p=77810</guid>
  42.  
  43. <description><![CDATA[<p>As part of GitHub's dedication to accessibility, we expanded our internal accessibility program and scaled up our internal auditing process to help remove or lower barriers for users with disabilities. Then, we empowered employees from various disciplines to drive accessibility efforts within their teams.</p>
  44. <p>The post <a href="https://github.blog/2024-05-01-empowering-accessibility-githubs-journey-building-an-in-house-champions-program/">Empowering accessibility: GitHub&#8217;s journey building an in-house Champions program</a> appeared first on <a href="https://github.blog">The GitHub Blog</a>.</p>
  45. ]]></description>
  46. <content:encoded><![CDATA[<div class="content-table-wrap"><table style="border: 1px black">
  47. <tbody>
  48. <tr>
  49. <td>
  50. For more on this topic, check out <a href="https://www.deque.com/axe-con/speakers/alexis-lucio/">Alexis Lucio</a>, <a href="https://www.deque.com/axe-con/speakers/catharine-mcnally/">Catherine McNally</a>, and <a href="https://www.deque.com/axe-con/speakers/lindsey-wild/">Lindsey Wild</a>&#8216;s <a href="https://www.deque.com/axe-con">axe-con 2024</a> talk, &#8220;Establishing a Scalable A11y Education Ecosystem,&#8221; which laid the foundation for this blog post. <em>Free registration required.</em>
  51. </td>
  52. </tr>
  53. </tbody>
  54. </table></div>
  55. <h2 id="laying-the-foundation">Laying the foundation<a href="#laying-the-foundation" class="heading-link pl-2 text-italic text-bold" aria-label="Laying the foundation"></a></h2>
  56. <p>In today&#8217;s digital world, accessibility isn&#8217;t merely a checkbox—it&#8217;s the cornerstone of creating an inclusive experience for all users. At GitHub, we recognize this fundamental truth. That&#8217;s why we&#8217;ve embarked on a journey to empower developers, including those with disabilities, to participate fully and thrive on our platform. Our commitment to accessibility isn&#8217;t a one-time endeavor; it&#8217;s an ongoing effort fueled by the desire to remove barriers and make technology accessible to everyone.</p>
  57. <p>As part of GitHub&#8217;s dedication to accessibility, we&#8217;ve been expanding our internal accessibility program and have scaled up our internal auditing process to help remove or lower barriers for users with disabilities. Naturally, as the number of audits increased, so did the issues requiring attention, which strained our centralized accessibility team. Instead of seeing this as a setback, we embraced it as an opportunity for creativity. Understanding the importance of decentralizing ownership of accessibility across the organization, we took decisive action by launching GitHub&#8217;s Accessibility Champions program. This strategic initiative empowers employees from various disciplines to drive accessibility efforts within their teams, fostering a culture where accessibility is deeply ingrained and valued.</p>
  58. <p>The journey to establish GitHub&#8217;s Accessibility Champions program began with a comprehensive examination of our existing challenges and opportunities. We understood that for the program to thrive, we needed to consider various factors, including different time zones and work schedules, the expertise levels of our employees, and their ability to dedicate time to accessibility efforts due to competing priorities. By thoroughly assessing these considerations, we aimed to ensure that the program would be effective and adaptable to our team&#8217;s evolving needs.</p>
  59. <p>To lay a solid foundation for the program&#8217;s success, we established clear goals and defined responsibilities for our champions upon completing their training. By setting measurable objectives and metrics to track the program&#8217;s impact on accessibility efforts both within the company and beyond, we provided our champions with a clear roadmap to follow. This proactive approach ensured we were all aligned in our efforts to make GitHub a more inclusive platform.</p>
  60. <h2 id="starting-small">Starting small<a href="#starting-small" class="heading-link pl-2 text-italic text-bold" aria-label="Starting small"></a></h2>
  61. <p>At the heart of the GitHub Accessibility Champions program&#8217;s success is the development of a comprehensive and dynamic curriculum. Understanding that people have different learning preferences, GitHub took a tailored approach by assembling different types of educational resources. These resources were carefully curated to cater to various learning styles and delivered asynchronously through videos, articles, and interactive exercises.</p>
  62. <p>Participants in the program received training on digital accessibility fundamentals, including <a href="https://www.w3.org/WAI/standards-guidelines/wcag">WCAG guidelines</a>, inclusive design principles, testing techniques, and content/interface accessibility best practices. They learned to identify and address accessibility barriers, advocate for accessibility within their teams, and utilize assistive technologies. Participants gained practical experience creating inclusive digital experiences through hands-on exercises and interactive discussions.</p>
  63. <p>The program began with a modest group of 17 engineering champions serving as pioneers in the initiative. This small-scale pilot allowed GitHub to fine-tune the curriculum, gather valuable feedback, and iterate on the program&#8217;s structure and content. As the program evolved and gained momentum, it gradually expanded to include 52 champions from a variety of backgrounds, spanning engineering, design, and content teams. Our plan for this year is to reach over 100 internal champions to help support our accessibility goals.</p>
  64. <p>This phased approach to scaling the GitHub Accessibility Champions program has proved invaluable. By starting small and gradually growing the community of champions, we were able to refine the program iteratively, ensuring it met the evolving needs of participants. Moreover, this approach fostered a strong sense of camaraderie among champions, creating a network of advocates dedicated to advancing accessibility across the organization.</p>
  65. <h2 id="embracing-feedback-and-iteration">Embracing feedback and iteration<a href="#embracing-feedback-and-iteration" class="heading-link pl-2 text-italic text-bold" aria-label="Embracing feedback and iteration"></a></h2>
  66. <p>Feedback was instrumental in shaping the trajectory of the GitHub Accessibility Champions program, serving as a guiding force in its evolution. As participants engaged with the program, their voices were invaluable in driving improvements and enhancements to meet their needs.</p>
  67. <p>One recurring theme in the feedback was the desire for more interactive experiences and community engagement. Participants expressed a hunger for opportunities to connect with fellow champions, share insights, and collaborate on addressing accessibility challenges. In response, we introduced monthly Champions Connect meetings, providing a platform for champions to come together, exchange ideas, and foster a sense of camaraderie. These gatherings facilitated knowledge sharing and motivated and inspired champions as they navigated their accessibility journeys.</p>
  68. <blockquote><p>
  69.  &#8220;Being able to ask questions and get answers quickly on simple matters is important to my team’s success. Or, if the questions are too complex to get immediate answers, having a forum to take the time and unpack them to get the answers.&#8221;
  70. </p></blockquote>
  71. <p>Participants also emphasized the importance of hands-on experiences in honing their skills and understanding of accessibility principles. Recognizing this need, we organized bug bashes and collaborative events where teams worked together to identify and address accessibility issues in real-time. These sessions provided practical learning opportunities and fostered a culture of teamwork and collective problem-solving.</p>
  72. <p>In addition to enhancing engagement within the champions community, we responded to the demand for more synchronous training sessions. We hosted live sessions tailored to the specific needs of engineers and product managers, providing a platform for interactive discussions, Q&amp;A sessions, and technical deep dives. These sessions offered a valuable opportunity for participants to engage directly with experts, seek clarification on complex topics, and deepen their understanding of accessibility best practices.</p>
  73. <blockquote><p>
  74.  &#8220;Getting a <a href="https://github.com/features/codespaces">codespace</a> to identify issues and identify remediations is an excellent way to move from using and understanding assistive technology to taking on the role of an auditor or engineer who is verifying fixes.”
  75. </p></blockquote>
  76. <p>Finally, we initiated roundtable discussions with customers with disabilities, recognizing the importance of incorporating diverse perspectives into the design and development process. These interactions provided invaluable insights into the experiences and needs of users with disabilities, highlighting the critical role of inclusive design practices. By engaging directly with end-users, every champion at GitHub gained a deeper understanding of accessibility challenges and priorities, informing the development of more user-centric and inclusive digital experiences.</p>
  77. <blockquote><p>
  78.  “Communicating the value of <em>why</em> we should design and create accessible documentation is key to success on my team. Everyone wants to do the right thing and is willing to do more complex tasks if they understand how it helps people better use our product.”
  79. </p></blockquote>
  80. <p>Overall, feedback catalyzed continuous improvement and innovation within the GitHub Accessibility Champions program. By actively listening to participant input and responding with targeted initiatives, we demonstrate our commitment to fostering a culture of accessibility and inclusion. Through ongoing engagement, collaboration, and user-centered design, GitHub continues to advance accessibility efforts, empowering all users to access and interact with its platform seamlessly.</p>
  81. <blockquote><p>
  82.  “I loved that the training was super detailed, to a point where someone with zero information on accessibility can get started with basic concepts all the way to acknowledging problems they didn&#8217;t know existed.”
  83. </p></blockquote>
  84. <h2 id="expanding-reach-and-impact">Expanding reach and impact<a href="#expanding-reach-and-impact" class="heading-link pl-2 text-italic text-bold" aria-label="Expanding reach and impact"></a></h2>
  85. <p>While we are proud of our progress so far, the GitHub  Accessibility Champions program isn&#8217;t just about addressing internal challenges and setting an example for the broader tech community. By sharing our experiences and best practices, we hope to inspire other organizations to prioritize accessibility and inclusion in their own initiatives.</p>
  86. <p>As we reflect on the journey of GitHub&#8217;s Accessibility Champions program, there are several key takeaways and future directions that can provide valuable insights for other teams and organizations embarking on similar initiatives:</p>
  87. <ol>
  88. <li><strong>Start where you are</strong>. Take stock of your current situation and identify areas where accessibility education can be improved. Understanding your organization&#8217;s unique needs and challenges is the first step toward meaningful progress. </li>
  89. <li><strong>Go where you&#8217;re wanted</strong>. Invest your resources with a clear advocacy for accessibility and a willingness to engage in educational programs. By aligning your efforts with enthusiastic stakeholders, you can maximize the impact of your initiatives. </li>
  90. <li><strong>Pilot with a small group</strong>. Begin with a small group to test your programs and gather feedback before scaling up. This phased approach allows for experimentation and refinement, ensuring that your initiatives are effective and sustainable in the long run. </li>
  91. <li><strong>Lean into organic partnerships</strong>. Collaborate across teams and titles to create a cohesive ecosystem of accessibility education. By leveraging the expertise and resources available within your organization, you can amplify the impact of your efforts and foster a culture of inclusivity. </li>
  92. <li><strong>Seek out, review, and take action on feedback</strong>. Actively solicit feedback from participants and stakeholders and use it to inform program improvements. By listening to the needs and experiences of your audience, you can continuously iterate and enhance the effectiveness of your initiatives. </li>
  93. <li><strong>Collect and re-evaluate metrics</strong>. Continuously monitor and evaluate the impact of your educational initiatives to track progress and effectiveness over time. By collecting meaningful metrics and analyzing trends, you can identify areas for improvement and demonstrate the value of your efforts to key stakeholders.</li>
  94. </ol>
  95. <h2 id="conclusion">Conclusion<a href="#conclusion" class="heading-link pl-2 text-italic text-bold" aria-label="Conclusion"></a></h2>
  96. <p>The GitHub Accessibility Champions program demonstrates our dedication to fostering a culture of accessibility and inclusion. By prioritizing feedback, collaboration, and responsiveness, we have created a supportive ecosystem where individuals can learn, grow, and acquire the tools to build more inclusive digital experiences. Our champions are truly a community of passionate accessibility advocates.</p>
  97. <p>Looking ahead, we’re committed to enhancing the GitHub Accessibility Champions program, advancing accessibility efforts across the organization, and sharing our journey with the broader tech community—paving the way for a more inclusive digital future for all.</p>
  98. <div class="post-content-cta"><p>Please visit <a href="https://accessibility.github.com/">accessibility.github.com</a> to learn more and to share feedback on our accessibility community discussion page.</p>
  99. </div>
  100. <p>The post <a href="https://github.blog/2024-05-01-empowering-accessibility-githubs-journey-building-an-in-house-champions-program/">Empowering accessibility: GitHub&#8217;s journey building an in-house Champions program</a> appeared first on <a href="https://github.blog">The GitHub Blog</a>.</p>
  101. ]]></content:encoded>
  102. <post-id xmlns="com-wordpress:feed-additions:1">77810</post-id> </item>
  103. <item>
  104. <title>5 tips to supercharge your developer career in 2024</title>
  105. <link>https://github.blog/2024-05-01-5-tips-to-supercharge-your-developer-career-in-2024/</link>
  106. <dc:creator><![CDATA[Jeimy Ruiz]]></dc:creator>
  107. <pubDate>Wed, 01 May 2024 16:10:45 +0000</pubDate>
  108. <category><![CDATA[Engineering]]></category>
  109. <category><![CDATA[career development]]></category>
  110. <category><![CDATA[GitHub Universe]]></category>
  111. <guid isPermaLink="false">https://github.blog/?p=77775</guid>
  112.  
  113. <description><![CDATA[<p>From mastering prompt engineering to leveraging AI for code security, here’s how you can excel in today's competitive job market.  </p>
  114. <p>The post <a href="https://github.blog/2024-05-01-5-tips-to-supercharge-your-developer-career-in-2024/">5 tips to supercharge your developer career in 2024</a> appeared first on <a href="https://github.blog">The GitHub Blog</a>.</p>
  115. ]]></description>
  116. <content:encoded><![CDATA[<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
  117. <html><body><p>The world of software development is constantly evolving. That means whether you&rsquo;re a seasoned developer or just starting out on your coding journey, there&rsquo;s always something new to learn.</p>
  118. <p>Below, we&rsquo;ll explore five actionable tips to take your career to the next level. From mastering prompt engineering to harnessing the power of AI for code security, these tips will help you learn the skills and uncover the knowledge you need to excel in today&rsquo;s competitive job market.</p>
  119. <h2 id="tip-1-become-a-pro-at-prompt-engineering" id="tip-1-become-a-pro-at-prompt-engineering" >Tip #1: Become a pro at prompt engineering<a href="#tip-1-become-a-pro-at-prompt-engineering" class="heading-link pl-2 text-italic text-bold" aria-label="Tip #1: Become a pro at prompt engineering"></a></h2>
  120. <p>In the age of AI, you can use AI tools like GitHub Copilot to code up to <a href="https://github.blog/2022-09-07-research-quantifying-github-copilots-impact-on-developer-productivity-and-happiness/">55% faster</a>. But like any other tool or skill, our AI pair programmer has a learning curve, and there are certain techniques you can use that will make your work with AI even more effective. Enter prompt engineering. With prompt engineering, you provide GitHub Copilot with more context about your project&mdash;which yields better, more accurate results. Below are three best practices for crafting prompts for GitHub Copilot:</p>
  121. <h3 id="open-related-files-in-vs-code-while-using-github-copilot" id="open-related-files-in-vs-code-while-using-github-copilot" >Open related files in VS Code while using GitHub Copilot<a href="#open-related-files-in-vs-code-while-using-github-copilot" class="heading-link pl-2 text-italic text-bold" aria-label="Open related files in VS Code while using GitHub Copilot"></a></h3>
  122. <p>While you can begin using GitHub Copilot with a blank file, one easy way to introduce more context is to open related files in VS Code. Known as <a href="https://github.blog/2023-05-17-how-github-copilot-is-getting-better-at-understanding-your-code/#how-github-copilot-understands-your-code?utm_source=insider&amp;utm_medium=email&amp;utm_campaign=2024q1-em-GitHub-Insider-February-22">neighboring tabs,</a> this technique enables Copilot to gain a deeper understanding of your code by processing all open files in your IDE.</p>
  123. <p>This broader scope allows Copilot to identify matching code segments across your project, enhancing its suggestions and code completion capabilities.</p>
  124. <h3 id="provide-a-top-level-comment-in-your-code-file" id="provide-a-top-level-comment-in-your-code-file" >Provide a top-level comment in your code file<a href="#provide-a-top-level-comment-in-your-code-file" class="heading-link pl-2 text-italic text-bold" aria-label="Provide a top-level comment in your code file"></a></h3>
  125. <p>Imagine being assigned a task with little to no context&mdash;that would make accomplishing it much more difficult, right? The same can be said for GitHub Copilot. When you add a brief, <a href="https://github.blog/2023-06-20-how-to-write-better-prompts-for-github-copilot/#1-set-the-stage-with-a-high-level-goal">top-level comment</a> in your code file, it helps Copilot understand the overarching objective before getting into the <em>how</em>.</p>
  126. <p>Once you&rsquo;ve broken down the ask and your goal, you can articulate the logic and steps required to achieve it. Then, allow Copilot to generate code incrementally, rather than all at once. This approach enhances Copilot&rsquo;s understanding and improves the quality of the generated code.</p>
  127. <h3 id="input-sample-code" id="input-sample-code" >Input sample code<a href="#input-sample-code" class="heading-link pl-2 text-italic text-bold" aria-label="Input sample code"></a></h3>
  128. <p>Offer GitHub Copilot a <a href="https://github.blog/2023-06-20-how-to-write-better-prompts-for-github-copilot/#whats-a-prompt-and-what-is-prompt-engineering?utm_source=insider&amp;utm_medium=email&amp;utm_campaign=2024q1-em-GitHub-Insider-February-22">snippet of code</a> that closely resembles what you need. Even a brief example can further help Copilot craft suggestions tailored to your language and objectives!</p>
  129. <h2 id="tip-2-learn-shortcuts-and-hacks" id="tip-2-learn-shortcuts-and-hacks" >Tip #2: Learn shortcuts and hacks<a href="#tip-2-learn-shortcuts-and-hacks" class="heading-link pl-2 text-italic text-bold" aria-label="Tip #2: Learn shortcuts and hacks"></a></h2>
  130. <p>GitHub is full of <a href="https://images.github.media/Web/GitHubInc/%7Bdee1b5bb-19a4-4a85-9a40-678ed551e40d%7D_github-insider-archive-nov-2023.html">shortcuts and hacks</a> that make your work life easier and help you <a href="https://github.blog/2024-01-22-how-to-get-in-the-flow-while-coding-and-why-its-important/">stay in the flow</a>. Gain momentum in your projects and increase your productivity with these popular shortcuts:</p>
  131. <h3 id="search-for-any-file-in-your-repositories" id="search-for-any-file-in-your-repositories" >Search for any file in your repositories<a href="#search-for-any-file-in-your-repositories" class="heading-link pl-2 text-italic text-bold" aria-label="Search for any file in your repositories"></a></h3>
  132. <p>When you&rsquo;re searching through repositories, type the letter &ldquo;t&rdquo; on your keyboard to activate the file finder and do away with hours of wasted time! See how in the video below:</p>
  133. <div class="mod-vh position-relative" style="height: 0; padding-bottom: calc((9 / 16)*100%);">
  134. <iframe loading="lazy" class="position-absolute top-0 left-0 width-full height-full" src="https://www.youtube.com/embed/aMD7XmtomOI?version=3&amp;rel=1&amp;showsearch=0&amp;showinfo=1&amp;iv_load_policy=1&amp;fs=1&amp;hl=en-US&amp;autohide=2&amp;wmode=transparent" title="YouTube video player" allow="accelerometer; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen="" frameborder="0"></iframe>
  135. </div>
  136. <h3 id="link-your-pull-requests-to-your-issues" id="link-your-pull-requests-to-your-issues" >Link your pull requests to your issues<a href="#link-your-pull-requests-to-your-issues" class="heading-link pl-2 text-italic text-bold" aria-label="Link your pull requests to your issues"></a></h3>
  137. <p>Did you know that GitHub also has project management tools? One of them is a handy interlinking feature that allows you to <a href="https://docs.github.com/issues/tracking-your-work-with-issues/linking-a-pull-request-to-an-issue">link pull requests</a> and Git commits to relevant issues in a project. This facilitates better organization, collaboration, and project management, not just for you, but for anyone looking for more context in your issue. Gone are the days of hunting down old issues every time you create a new pull request!</p>
  138. <h3 id="create-custom-actions" id="create-custom-actions" >Create custom actions<a href="#create-custom-actions" class="heading-link pl-2 text-italic text-bold" aria-label="Create custom actions"></a></h3>
  139. <p>Creating <a href="https://resources.github.com/learn/pathways/automation/advanced/building-your-first-custom-github-action/">custom actions</a> on GitHub enables you to enhance code reuse, bypass repetition, and simplify maintenance across multiple workflows. All you have to do is outline the necessary steps for a particular task and package them into an action using any supported programming or scripting language, and you&rsquo;re all set!</p>
  140. <h3 id="incorporate-feedback-in-pull-requests" id="incorporate-feedback-in-pull-requests" >Incorporate feedback in pull requests<a href="#incorporate-feedback-in-pull-requests" class="heading-link pl-2 text-italic text-bold" aria-label="Incorporate feedback in pull requests"></a></h3>
  141. <p>Ever wish there was an easier way to review code? Well, it&rsquo;s possible! Add comments directly to the pull request, propose changes, and even accept and add those suggestions seamlessly to make code reviews easier than ever. You can also save your replies by heading over to the comment box in an open pull request and selecting &ldquo;create new saved reply,&rdquo; and then &ldquo;add saved reply,&rdquo; to make it official.</p>
  142. <h2 id="tip-3-brush-up-on-your-soft-skills" id="tip-3-brush-up-on-your-soft-skills" >Tip #3: Brush up on your soft skills<a href="#tip-3-brush-up-on-your-soft-skills" class="heading-link pl-2 text-italic text-bold" aria-label="Tip #3: Brush up on your soft skills"></a></h2>
  143. <p>AI has introduced a host of hard skills that developers need to master in order to keep up with the latest tooling. <a href="https://github.blog/2024-03-07-hard-and-soft-skills-for-developers-coding-in-the-age-of-ai/#and-now-the-soft-skills">Soft skills</a> <em>complement</em> your new technical expertise and can contribute to your overall success by enhancing communication, collaboration, and problem-solving. Here are a few important ones to practice:</p>
  144. <h3 id="communication" id="communication" >Communication<a href="#communication" class="heading-link pl-2 text-italic text-bold" aria-label="Communication"></a></h3>
  145. <p>As you know, developer work rarely happens in a vacuum. Strong communication skills can facilitate clear understanding and efficient collaboration for both humans and AI tools, whether you&rsquo;re collaborating with stakeholders, communicating complex technical concepts to non-technical audiences, or working on your prompt engineering.</p>
  146. <h3 id="problem-solving" id="problem-solving" >Problem-solving<a href="#problem-solving" class="heading-link pl-2 text-italic text-bold" aria-label="Problem-solving"></a></h3>
  147. <p>Critical thinking enables developers to approach complex challenges creatively, break them down into manageable tasks, and find innovative solutions with the help of AI coding tools.</p>
  148. <h3 id="adaptability" id="adaptability" >Adaptability<a href="#adaptability" class="heading-link pl-2 text-italic text-bold" aria-label="Adaptability"></a></h3>
  149. <p>AI coding tools are evolving rapidly, with new technologies, methodologies, and tools emerging regularly. Being adaptable allows developers to stay current, learn new skills quickly, and stay nimble as things change. To cultivate resilience and embrace discomfort (in and outside of the workplace), engage in activities that challenge you to anticipate and respond to the unexpected.</p>
  150. <h3 id="ethics" id="ethics" >Ethics<a href="#ethics" class="heading-link pl-2 text-italic text-bold" aria-label="Ethics"></a></h3>
  151. <p>Being aware of the ethical implications associated with these tools is essential. Developers should understand both the capabilities and limitations of AI coding tools and exercise critical thinking when interpreting responses from them. By remaining conscious of ethical considerations and actively working toward ethical practices, developers can ensure that these tools are used responsibly.</p>
  152. <h3 id="empathy" id="empathy" >Empathy<a href="#empathy" class="heading-link pl-2 text-italic text-bold" aria-label="Empathy"></a></h3>
  153. <p>Empathy is crucial for understanding the needs, preferences, and challenges of end-users. Empathy also fosters better collaboration within teams by promoting understanding and respect for colleagues&rsquo; perspectives and experiences.</p>
  154. <h2 id="tip-4-use-ai-to-secure-your-code" id="tip-4-use-ai-to-secure-your-code" >Tip #4: Use AI to secure your code<a href="#tip-4-use-ai-to-secure-your-code" class="heading-link pl-2 text-italic text-bold" aria-label="Tip #4: Use AI to secure your code"></a></h2>
  155. <p>Developers can leverage AI to <a href="https://images.github.media/Web/GitHubInc/%7Baebd3ff8-2199-4def-b94b-0825c04e826f%7D_github-insider-archive-dec-2023.html">enhance code security in several ways</a>. First, <em><a href="https://www.fastcompany.com/90979519/ai-future-of-cybersecurity-adopt-securely">AI can help prevent vulnerabilities</a> by providing context and secure code suggestions</em> right from the start. Traditionally, &ldquo;shift left&rdquo; meant getting security feedback after coding (but before deployment). By utilizing AI as a pair programmer, developers can &ldquo;shift left&rdquo; by addressing security concerns right where they bring their ideas to code.</p>
  156. <p>A common pain point for developers is sifting through lengthy pages of alerts, many of which turn out to be false positives&mdash;wasting valuable time and resources. With features like <a href="https://github.blog/2024-01-05-5-ways-to-make-your-devsecops-strategy-developer-friendly/#4-use-ai-and-automation-to-help-developers-find-and-fix-vulnerabilities">code scanning autofix</a>, <em>AI and automation can step in to provide AI-generated code fixes</em> alongside vulnerability alerts, streamlining remediation directly into the developer workflow. Similarly, <a href="https://docs.github.com/code-security/code-scanning/introduction-to-code-scanning/about-code-scanning">secret scanning</a> alerts developers to potential secrets detected in the code.</p>
  157. <p><iframe src="https://www.linkedin.com/embed/feed/update/urn:li:ugcPost:7044098919739375616?compact=1" height="399" width="710" frameborder="0" allowfullscreen="" title="Embedded post"></iframe></p>
  158. <p><em>AI also presents an opportunity to <a href="https://www.linkedin.com/feed/update/urn:li:activity:7044098920532086784/">improve the modeling of a vast array of open-source frameworks and libraries</a></em>. Traditionally, security teams manually model numerous packages and APIs. This is a challenging task given the volume and diversity of these components, along with frequent updates and replacements. By infusing AI in modeling efforts, developers can increase the detection of vulnerabilities.</p>
  159. <h2 id="tip-5-attend-github-universe-2024" id="tip-5-attend-github-universe-2024" >Tip #5: Attend GitHub Universe 2024<a href="#tip-5-attend-github-universe-2024" class="heading-link pl-2 text-italic text-bold" aria-label="Tip #5: Attend GitHub Universe 2024"></a></h2>
  160. <p>Attending conferences is a valuable investment in a developer&rsquo;s career, providing opportunities for learning, networking, skill development, and professional growth all at the same time. <a href="https://githubuniverse.com/">GitHub Universe</a> is our flagship, global event that brings together developers, leaders, and companies for two days of exploring the latest technologies and industry trends with fun, food, and networking in between. Here are some of the highlights:</p>
  161. <h3 id="100-sessions-on-ai-devex-and-security" id="100-sessions-on-ai-devex-and-security" >100+ sessions on AI, DevEx, and security<a href="#100-sessions-on-ai-devex-and-security" class="heading-link pl-2 text-italic text-bold" aria-label="100+ sessions on AI, DevEx, and security"></a></h3>
  162. <p>Learn about frameworks and best practices directly from 150+ experts in the field through keynotes, breakout sessions, product demos, and more.</p>
  163. <h3 id="gain-and-practice-new-skills" id="gain-and-practice-new-skills" >Gain and practice new skills<a href="#gain-and-practice-new-skills" class="heading-link pl-2 text-italic text-bold" aria-label="Gain and practice new skills"></a></h3>
  164. <p>Git official by signing up for an interactive workshop or getting <a href="https://examregistration.github.com/faq">GitHub certified</a> in GitHub Actions, GitHub Advanced Security, GitHub Foundations, or GitHub Administration. It&rsquo;ll certainly look great on your resume and LinkedIn. &#128521;</p>
  165. <h3 id="visibility" id="visibility" >Visibility<a href="#visibility" class="heading-link pl-2 text-italic text-bold" aria-label="Visibility"></a></h3>
  166. <p>Sharing insights, presenting research findings, or showcasing projects can help developers establish themselves as thought leaders and experts in their field. The Universe call for sessions is open from now until May 10. <a href="https://reg.githubuniverse.com/flow/github/universe24/cfs/page/cfslandingpage">Submit a session proposal today</a>!</p>
  167. <h3 id="professional-development" id="professional-development" >Professional development<a href="#professional-development" class="heading-link pl-2 text-italic text-bold" aria-label="Professional development"></a></h3>
  168. <p>Show your commitment to your career and continuous learning by visiting the dedicated Career Corner for professional development.</p>
  169. <h3 id="community-engagement" id="community-engagement" >Community engagement<a href="#community-engagement" class="heading-link pl-2 text-italic text-bold" aria-label="Community engagement"></a></h3>
  170. <p>Build your network and find opportunities for collaboration and mentorship by engaging with peers and participating in the Discussions Lounge.</p>
  171. <p><a href="https://github.blog/2024-04-16-the-worlds-fair-of-software-join-us-at-github-universe-2024/">Learn more</a> about our content tracks and what we have in store for the 10th anniversary of our global developer event.</p>
  172. <h2 id="navigate-your-career-with-confidence" id="navigate-your-career-with-confidence" >Navigate your career with confidence<a href="#navigate-your-career-with-confidence" class="heading-link pl-2 text-italic text-bold" aria-label="Navigate your career with confidence"></a></h2>
  173. <p>By implementing the strategies outlined above, you&rsquo;ll be well-equipped to unlock your dream career in 2024 and beyond. And remember: you can take your skills to the next level, network with industry leaders, and learn how to use the latest AI tools at GitHub Universe 2024.</p>
  174. <div class="post-content-cta"><p><strong>Eager to get involved?</strong> Act fast to save <a href="https://githubuniverse.com/?utm_source=Blog&amp;utm_medium=GitHub&amp;utm_campaign=5-tips">30% on in-person tickets</a> with our Super Early Bird discount from now until July 8, or get notified about our free virtual event!</p>
  175. </div>
  176. </body></html>
  177. <p>The post <a href="https://github.blog/2024-05-01-5-tips-to-supercharge-your-developer-career-in-2024/">5 tips to supercharge your developer career in 2024</a> appeared first on <a href="https://github.blog">The GitHub Blog</a>.</p>
  178. ]]></content:encoded>
  179. <post-id xmlns="com-wordpress:feed-additions:1">77775</post-id> </item>
  180. <item>
  181. <title>Where does your software (really) come from?</title>
  182. <link>https://github.blog/2024-04-30-where-does-your-software-really-come-from/</link>
  183. <dc:creator><![CDATA[Trevor Rosen]]></dc:creator>
  184. <pubDate>Tue, 30 Apr 2024 16:35:21 +0000</pubDate>
  185. <category><![CDATA[Security]]></category>
  186. <category><![CDATA[GitHub Actions]]></category>
  187. <category><![CDATA[GitHub CLI]]></category>
  188. <category><![CDATA[supply chain security]]></category>
  189. <guid isPermaLink="false">https://github.blog/?p=77757</guid>
  190.  
  191. <description><![CDATA[<p>GitHub is working with the OSS community to bring new supply chain security capabilities to the platform.</p>
  192. <p>The post <a href="https://github.blog/2024-04-30-where-does-your-software-really-come-from/">Where does your software (really) come from?</a> appeared first on <a href="https://github.blog">The GitHub Blog</a>.</p>
  193. ]]></description>
  194. <content:encoded><![CDATA[<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
  195. <html><body><p>Software is a funny, profound thing: each piece of it is an invisible machine, seemingly made of magic words, designed to run on the ultimate, <em>universal</em> machine. It&rsquo;s not alive, but it has a <em>lifecycle</em>. It starts out as source code&mdash;just text files, sitting in a repository somewhere&mdash;and then later (through some unique process) that source gets <em>built</em> into something else. A chunk of minified Javascript delivered to a web server, a container image full of framework code and business logic, a raw binary compiled for a specific processor architecture. That final stage of metamorphosis, that <em>something else</em> that source code becomes, is what we usually refer to as a &ldquo;software artifact,&rdquo;and after their creation artifacts tend to spend a good chunk of time at rest, waiting to be used. They do it in package registries (like npm, RubyGems, PyPI, MavenCentral, etc.) or in container registries (like GitHub Packages, Azure Container Registry, AWS ECR, etc.), as binaries attached to GitHub Releases, or just a ZIP file sitting in blob storage somewhere.</p>
  196. <p>Eventually, someone decides to pick up that artifact and <em>use it</em>. They unzip the package, execute the code, launch the container, install the driver, update the firmware&mdash;no matter the modality, suddenly the built thing is <em>running.</em> This is the culmination of a production lifecycle that can take many human-hours, cost lots of money, and (given that the modern world runs on software) can be as high-stakes as it gets.</p>
  197. <p><img fetchpriority="high" decoding="async" src="https://github.blog/wp-content/uploads/2024/04/image-31.png?w=1024&#038;resize=1024%2C191" alt="Process diagram demonstrating the flow from producer to source to build package to consumer." width="1024" height="191" class="aligncenter size-large wp-image-77760 width-fit" srcset="https://github.blog/wp-content/uploads/2024/04/image-31.png?w=2576 2576w, https://github.blog/wp-content/uploads/2024/04/image-31.png?w=300 300w, https://github.blog/wp-content/uploads/2024/04/image-31.png?w=768 768w, https://github.blog/wp-content/uploads/2024/04/image-31.png?w=1024&#038;resize=1024%2C191 1024w, https://github.blog/wp-content/uploads/2024/04/image-31.png?w=1536 1536w, https://github.blog/wp-content/uploads/2024/04/image-31.png?w=2048 2048w" sizes="(max-width: 1000px) 100vw, 1000px" data-recalc-dims="1" /></p>
  198. <p>And yet, in so many cases, we don&rsquo;t have a strong guarantee that the artifact that we <em>run</em> is most definitely the thing that we <em>built</em>. The details of that artifact&rsquo;s journey are lost, or at best are hazy; it&rsquo;s hard to connect the artifact back to the source code and build instructions from whence it came. This lack of visibility into the artifact&rsquo;s lifecycle is the source of many of today&rsquo;s most compelling security challenges. Throughout the SDLC there are opportunities to secure the flow of code transforming into artifacts&mdash;doing so helps remove the risk that threat actors will poison finalized software and create havoc.</p>
  199. <p>Some challenges in cybersecurity can feel almost impossible to successfully address, but this isn&rsquo;t one of them. Let&rsquo;s dig in with some background.</p>
  200. <h2 id="digests-and-signatures" id="digests-and-signatures" >Digests and signatures<a href="#digests-and-signatures" class="heading-link pl-2 text-italic text-bold" aria-label="Digests and signatures"></a></h2>
  201. <p>Say you have a file in your home directory, and you want to make sure that it&rsquo;s exactly the same tomorrow as it is today. What do you do? A good way to start is to generate a <em>digest</em> of the file by running it through a secure hashing algorithm. Here&rsquo;s how we can do that with OpenSSL, using the SHA-256 algorithm:</p>
  202. <pre><code>openssl dgst -sha256 ~/important-file.txt
  203. </code></pre>
  204. <p>Now, you&rsquo;ve got a <em>digest</em> (also called a <em>hash</em>), a 64-character string of letters and numbers representing a unique fingerprint for that file. Change literally anything in that file, and run the hash function again, and you&rsquo;ll get a different string. You can write down the digest somewhere and come back tomorrow and try the same process again. If you don&rsquo;t get the same digest string both times, something in the file has changed.</p>
  205. <p>Ok, so far, so good&mdash;we can determine whether something has been tampered with. What if we want to make a statement about the artifact? What if we want to say &ldquo;I saw this artifact today, and I (a system or a person) am guaranteeing that this particular thing is definitely the thing I saw.&rdquo; At that point, what you want is a software artifact <em>signature</em>; you want to take your digest string and run it through a cryptographic algorithm to produce <em>another</em> string representing the act of &ldquo;signing&rdquo; that fingerprint with a unique key. If you subsequently want someone else to be able to confirm your signature, you&rsquo;ll want to use <em>asymmetric</em> encryption: sign the digest with your private key and give out the corresponding public key so that anyone out there in the world who gets your file can verify it.</p>
  206. <p>You probably already know that asymmetric encryption is the basis for almost all trust on the internet. It&rsquo;s how you can securely interact with your bank, and how GitHub can securely deliver your repository contents. We use asymmetric encryption to power technologies, like TLS and SSH, to create trusted channels for communication, but we also use it to create a basis for trusting software via signatures.</p>
  207. <p>Operating systems like Windows, macOS, iOS, Android, etc. all have mechanisms for ensuring a trusted origin for executable software artifacts by enforcing the presence of a signature. These systems are incredibly important components of the modern software world, and building them is fiendishly difficult.</p>
  208. <h2 id="dont-just-sign-attest" id="dont-just-sign-attest" >Don&rsquo;t just sign&mdash;<em>attest</em><a href="#dont-just-sign-attest" class="heading-link pl-2 text-italic text-bold" aria-label="Don&rsquo;t just sign&mdash;&lt;em&gt;attest&lt;/em&gt;"></a></h2>
  209. <p>When thinking about how to expose more trustable information about a software artifact, a signature is a good start. It says &ldquo;some trusted system definitely saw this thing.&rdquo; But if you want to truly offer an evolutionary leap in the security of the SDLC as a whole, you need to go beyond mere signatures think in terms of <em>attestations</em>.</p>
  210. <p>An attestation is an assertion of fact, a statement made <em>about</em> an artifact or artifacts and <em>created by</em> some entity that can be authenticated. It can be authenticated because the statement is signed and the key that did the signing can be trusted.</p>
  211. <p>The most important and foundational kind of attestation is one that asserts facts about the origin and creation of the artifact&mdash;the source code it came from and build instructions that transmuted that source into an artifact. We call this a <em>provenance attestation</em>.</p>
  212. <p>The provenance attestation spec that we&rsquo;ve chosen comes from the <a href="https://slsa.dev">SLSA project</a>. SLSA is a great way to think about software supply chain security because it gives producers and consumers of software a common framework for reasoning about security guarantees and boundaries in a way that is agnostic of specific systems and tech stacks. SLSA offers a standardized schema for producing provenance attestations for software artifacts, based on the work done by the <a href="https://in-toto.io/">in-toto project</a>. in-toto is a CNCF-graduated project that exists to (among other things) provide a collection of standardized metadata schemas for relevant information about your supply chain and build process.</p>
  213. <h2 id="what-does-it-take-to-build-something-like-this" id="what-does-it-take-to-build-something-like-this" >What does it take to build something like this?<a href="#what-does-it-take-to-build-something-like-this" class="heading-link pl-2 text-italic text-bold" aria-label="What does it take to build something like this?"></a></h2>
  214. <p>As the largest global software development platform that hosts a lot of code and build pipelines, we&rsquo;ve been thinking about this a lot. There are a number of moving parts that it would take to build an attestation service.</p>
  215. <p>Doing so would mean having a way to:</p>
  216. <ul>
  217. <li>Issue certificates (essentially public keys bound to some authenticated identity).</li>
  218. <li>Make sure that those certificates can&rsquo;t be misused.</li>
  219. <li>Enable the secure signing of artifacts in a well-known context.</li>
  220. <li>Verify those signatures in a way the end-user can trust.</li>
  221. </ul>
  222. <p>This means setting up a <a href="https://en.wikipedia.org/wiki/Certificate_authority">Certificate Authority</a> (CA) and having some kind of client app you can use to authenticate the signatures associated with certs issued by that authority. In order to keep the certificates from being misused, you need to either 1) maintain <a href="https://en.wikipedia.org/wiki/Certificate_revocation_list">Certificate Revocation Lists</a> or 2) ensure that the signing certificate is short-lived, which means having a counter signature from some kind of timestamping authority (which can give an authoritative stamp that a cert was only used to produce a signature during the timeframe it was valid).</p>
  223. <p>This is where <a href="https://sigstore.dev">Sigstore</a> comes in. It&rsquo;s an open source project that offers both an X.<a href="https://github.com/sigstore/fulcio">509 CA</a> and a <a href="https://github.com/sigstore/timestamp-authority">timestamp authority</a> based on <a href="https://www.rfc-editor.org/rfc/rfc3161">RFC 3161</a>. And it also lets you do identity with <a href="https://www.microsoft.com/en-us/security/business/security-101/what-is-openid-connect-oidc">OIDC tokens</a>, which many CI systems <a href="https://docs.github.com/actions/deployment/security-hardening-your-deployments/about-security-hardening-with-openid-connect#getting-started-with-oidc">already produce</a> and associate with their workloads.</p>
  224. <p>Sigstore does for software signatures what <a href="https://letsencrypt.org/">Let&rsquo;s Encrypt</a> has done for TLS certificates: make them simple, transparent, and easy to adopt. <a href="https://github.blog/2022-10-25-why-were-excited-about-the-sigstore-general-availability/">GitHub</a> helps oversee the governance of the Sigstore project via our seat on the Technical Steering Committee, are maintainers of the server applications and multiple client libraries, and (along with folks from Google, RedHat, and Stacklok) form the operations team for the <a href="https://www.google.com/url?q=https://docs.sigstore.dev/system_config/public_deployment/&amp;sa=D&amp;source=docs&amp;ust=1714152554138847&amp;usg=AOvVaw3ffGaZvXDyXL1sXm81nqRV">Sigstore Public Good Instance</a>, which exists to support public attestations for OSS projects.</p>
  225. <p>Sigstore requires a secure root of trust that complies with the standard laid out by <a href="https://theupdateframework.org/">The Update Framework</a> (TUF). This allows clients to keep up with rotations in the CA&rsquo;s underlying keys without needing to update their code. TUF exists to mitigate a large number of <a href="https://theupdateframework.github.io/specification/latest/#goals-to-protect-against-specific-attacks">attack vectors</a> that can come into play when working to update code in situ. It&rsquo;s used by lots of projects for updating things like long-running telemetry agents in place, delivering secure firmware updates, etc.</p>
  226. <p>With Sigstore in place, it&rsquo;s possible to create a tamper-proof paper trail linking artifacts back to CI. This is really important because signing software and capturing details of provenance in a way that can&rsquo;t be forged means that software consumers have the means to enforce their own rules regarding the origin of the code they&rsquo;re executing, and we&rsquo;re excited to share more with you on this in the coming days. Stay tuned!</p>
  227. <div class="post-content-cta"><p>Harness the power of GitHub Advanced Security. <a href="https://docs.github.com/en/code-security/getting-started/github-security-features">Learn more</a> or <a href="https://github.com/features/security">get started now</a>.</p>
  228. </div>
  229. </body></html>
  230. <p>The post <a href="https://github.blog/2024-04-30-where-does-your-software-really-come-from/">Where does your software (really) come from?</a> appeared first on <a href="https://github.blog">The GitHub Blog</a>.</p>
  231. ]]></content:encoded>
  232. <post-id xmlns="com-wordpress:feed-additions:1">77757</post-id> </item>
  233. <item>
  234. <title>Highlights from Git 2.45</title>
  235. <link>https://github.blog/2024-04-29-highlights-from-git-2-45/</link>
  236. <dc:creator><![CDATA[Taylor Blau]]></dc:creator>
  237. <pubDate>Mon, 29 Apr 2024 17:14:27 +0000</pubDate>
  238. <category><![CDATA[Open Source]]></category>
  239. <category><![CDATA[Git]]></category>
  240. <guid isPermaLink="false">https://github.blog/?p=77738</guid>
  241.  
  242. <description><![CDATA[<p>Git 2.45 is here with experimental support for reftables, and SHA-256 interoperability. Get our take on the latest here.</p>
  243. <p>The post <a href="https://github.blog/2024-04-29-highlights-from-git-2-45/">Highlights from Git 2.45</a> appeared first on <a href="https://github.blog">The GitHub Blog</a>.</p>
  244. ]]></description>
  245. <content:encoded><![CDATA[<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
  246. <html><body><p>The open source Git project just <a href="https://lore.kernel.org/git/xmqq8r0ww0sj.fsf@gitster.g/T/#u">released Git 2.45</a> with features and bug fixes from over 96 contributors, 38 of them new. We last caught up with you on the latest in Git back when <a href="https://github.blog/2024-02-23-highlights-from-git-2-44/">2.44 was released</a>.</p>
  247. <p>To celebrate this most recent release, here is GitHub&rsquo;s look at some of the most interesting features and changes introduced since last time.</p>
  248. <h2 id="preliminary-reftable-support" id="preliminary-reftable-support" >Preliminary reftable support<a href="#preliminary-reftable-support" class="heading-link pl-2 text-italic text-bold" aria-label="Preliminary reftable support"></a></h2>
  249. <p>Git 2.45 introduces preliminary support for a new reference storage backend called &ldquo;reftable,&rdquo; promising faster lookups, reads, and writes for repositories with any number of references.</p>
  250. <p>If you&rsquo;re unfamiliar with our previous coverage of the new reftable format, don&rsquo;t worry, this post will catch you up to speed (and then some!). But if you just want to play around with the new reference backend, you can initialize a new repository with <code>--ref-format=reftable</code> like so:</p>
  251. <pre><code>$ git init --ref-format=reftable /path/to/repo
  252. Initialized empty Git repository in /path/to/repo/.git
  253. $ cd /path/to/repo
  254. $ git commit --allow-empty -m 'hello reftable!'
  255. [main (root-commit) 2eb0810] hello reftable!
  256. $ ls -1 .git/reftable/
  257. 0x000000000001-0x000000000002-565c6bf0.ref
  258. tables.list
  259. $ cat .git/reftable/tables.list
  260. 0x000000000001-0x000000000002-565c6bf0.ref
  261. </code></pre>
  262. <p>With that out of the way, let&rsquo;s jump into the details. If you&rsquo;re new to this series, or didn&rsquo;t catch our initial coverage of the reftable feature, don&rsquo;t worry, here&rsquo;s a refresher. When we talk about <a href="https://git-scm.com/book/en/v2/Git-Internals-Git-References">references</a> in Git, we&rsquo;re referring to the branches and tags that make up your repository. In essence, a reference is nothing more than a name (like <code>refs/heads/my-feature</code>, or <code>refs/tags/v1.0.0</code>) and the object ID of the thing that reference points at.</p>
  263. <p>Git has historically stored references in your repository in one of two ways: either &ldquo;loose&rdquo; as a file inside of <code>$GIT_DIR/refs</code> (like <code>$GIT_DIR/refs/heads/my-feature</code>) or &ldquo;packed&rdquo; as an entry inside of the file at <code>$GIT_DIR/packed_refs</code>.</p>
  264. <p>For most repositories today, the existing reference backend works fine. For repositories with a truly gigantic number of references, however, the existing backend has some growing pains. For instance, storing a large number of references as &ldquo;loose&rdquo; can lead to directories with a large number of entries (slowing down lookups within that directory) and/or <a href="https://en.wikipedia.org/wiki/Inode#Potential_for_inode_exhaustion_and_solutions">inode exhaustion</a>. Likewise, storing all references in a single <code>packed_refs</code> file can become expensive to maintain, as even small reference updates require a significant I/O-cost to rewrite the entire <code>packed_refs</code> file on each update.</p>
  265. <p>That&rsquo;s where the reftable format comes in. Reftable is an entirely new format for storing Git references. Instead of storing loose references, or constantly updating a large <code>packed_refs</code> file, reftable implements a binary format for storing references that promises to achieve:</p>
  266. <ul>
  267. <li>Near constant-time lookup for individual references, and near constant-time verification that a given object ID is referred to by at least one reference.</li>
  268. <li>Efficient lookup of entire reference namespaces through prefix compression.</li>
  269. <li>Atomic reference updates that scale with the size of the reference update, not the number of overall references.</li>
  270. </ul>
  271. <p>The reftable format is incredibly detailed (curious readers can learn more about it in more detail by reading <a href="https://github.com/git/git/blob/v2.45.0/Documentation/technical/reftable.txt">the original specification</a>), but here&rsquo;s a high-level overview. A repository can have any number of reftables (stored as <code>*.ref</code> files), each of which is organized into variable-sized blocks. Blocks can store information about a collection of references, refer to the contents of other blocks when storing references across a collection of blocks, and more.</p>
  272. <p>The format is designed to both (a) take up a minimal amount of space (by storing reference names with prefix compression) and (b) support fast lookups, even when reading the <code>.ref</code> file(s) from a cold cache.</p>
  273. <p>Most importantly, the reftable format supports multiple <code>*.ref</code> files, meaning that each reference update transaction can be processed individually without having to modify existing <code>*.ref</code> files. A separate compaction process describes how to &ldquo;merge&rdquo; a range of adjacent <code>*.ref</code> files together into a single <code>*.ref</code> file to maintain read performance.</p>
  274. <p>The reftable format was originally designed by <a href="https://git.github.io/rev_news/2017/08/16/edition-30/#developer-spotlight-shawn-pearce">Shawn Pearce</a> for use in <a href="https://www.eclipse.org/jgit/">JGit</a> to better support the large number of references stored by <a href="https://www.gerritcodereview.com/">Gerrit</a>. Back in our <em><a href="https://github.blog/2022-01-24-highlights-from-git-2-35/">Highlights from Git 2.35</a></em> post, we covered that an implementation of the reftable format had landed in Git. In that version, Git did not yet know how to use the new reftable code in conjunction with its existing reference backend system, meaning that you couldn&rsquo;t yet create repositories that store references using reftable.</p>
  275. <p>In Git 2.45, support for a reftable-powered storage backend has been integrated into Git&rsquo;s generic reference backend system, meaning that you can play with reftable on your own repository by running:</p>
  276. <pre><code>$ git init --ref-format=reftable /path/to/repo
  277. </code></pre>
  278. <p>[<a href="https://github.com/git/git/compare/3c2a3fdc388747b9eaf4a4a4f2035c1c9ddb26d0...8a0bebdeaec60623c8a791b197d574bdd031a452">source</a>, <a href="https://github.com/git/git/compare/274400998b0a2da64d20e9fa95b288bf1403459c...c68ca7abd30b22404ce59d5133566729c07ffe8f">source</a>, <a href="https://github.com/git/git/compare/ce65a188b15bef0ef68e81d5b083e7dda34ab2c9...e0795e2c7912bc407e311b8cd3ae908bc354d8c9">source</a>, <a href="https://github.com/git/git/compare/066124da88a6d43d125b30a1bc8a66c2d8ef6423...43f70eaea0e3fa9d98c895e9341674a67262b657">source</a>, <a href="https://github.com/git/git/compare/7a01b444638a2704befcd4c24e1d441b818ae67b...60c4c425155c61a081cc035240ee649aa2cb2e37">source</a>, <a href="https://github.com/git/git/compare/330ed38a2df0d67e247edc7ea69175520ead469d...fffd981ec2d7965733a4a15f9071e3734f7654a6">source</a>, <a href="https://github.com/git/git/compare/dc97afdcb93ca683bf73b4ae2ff028c161206617...fcacc2b161b095c99dfd4e0b05dcc1ed8ca80a62">source</a>, <a href="https://github.com/git/git/compare/50b52cafae4250319944d49d65f1fa8d83aedd58...0068aa794696188d3c9bea62804780d44bee824f">source</a>, <a href="https://github.com/git/git/compare/847af43a3afb39394d5fe58192f94b993ca18f9f...d51d8cc36831bdabbbcec8553a7e83d9f5a3be4d">source</a>, <a href="https://github.com/git/git/compare/2b49e41155d826d40ede07dfd4d34a7a36f9f64b...a949ebd342440049a1ac77ca675f66884eae4187">source</a>]</p>
  279. <h2 id="preliminary-support-for-sha-1-and-sha-256-interoperability" id="preliminary-support-for-sha-1-and-sha-256-interoperability" >Preliminary support for SHA-1 and SHA-256 interoperability<a href="#preliminary-support-for-sha-1-and-sha-256-interoperability" class="heading-link pl-2 text-italic text-bold" aria-label="Preliminary support for SHA-1 and SHA-256 interoperability"></a></h2>
  280. <p>Returning readers of this series will be familiar with our ongoing coverage of the Git project&rsquo;s <a href="https://git-scm.com/docs/hash-function-transition">hash function transition</a>. If you&rsquo;re new around here, or need a refresher, don&rsquo;t worry!</p>
  281. <p>Git identifies objects (the blobs, trees, commits, and tags that make up your repository) by a <a href="https://en.wikipedia.org/wiki/Hash_function">hash</a> of their contents. Since its inception, Git has used the <a href="https://en.wikipedia.org/wiki/SHA-1">SHA-1 hash function</a> to hash and identify objects in a repository.</p>
  282. <p>However, the SHA-1 function has known collision attacks (e.g., <a href="https://shattered.io/">Shattered</a>, and <a href="https://sha-mbles.github.io/">Shambles</a>), meaning that a sufficiently motivated attacker can generate a colliding pair of SHA-1 inputs, which have the same SHA-1 hash despite containing different contents. (Many providers, like GitHub, use a SHA-1 implementation that detects and rejects inputs that contain the telltale signs of being part of a colliding pair attack. For more details, see our post, <em><a href="https://github.blog/2017-03-20-sha-1-collision-detection-on-github-com/">SHA-1 collision detection on GitHub.com</a></em>).</p>
  283. <p>Around this time, the Git project <a href="https://lore.kernel.org/git/20170304011251.GA26789@aiede.mtv.corp.google.com/">began discussing</a> a plan to transition from SHA-1 to a more secure hash function that was not susceptible to the same chosen-prefix attacks. The project decided on SHA-256 as the successor to Git&rsquo;s use of SHA-1 and work on supporting the new hash function began in earnest. In Git 2.29 (released in October 2020), Git gained experimental support for using SHA-256 instead of SHA-1 in specially-configured repositories. That feature was declared no longer experimental in Git 2.42 (released in August 2023).</p>
  284. <p>One of the goals of the hash function transition was to introduce support for repositories to interoperate between SHA-1 and SHA-256, meaning that repositories could in theory use one hash function locally, while pushing to another repository that uses a different hash function.</p>
  285. <p>Git 2.45 introduces experimental preliminary support for limited interoperability between SHA-1 and SHA-256. To do this, Git 2.45 introduces a new concept called the &ldquo;compatibility&rdquo; object format, and allows you to refer to objects by either their given hash, or their &ldquo;compatibility&rdquo; hash. An object&rsquo;s compatibility hash is the hash of an object as it would have been written under the compatibility hash function.</p>
  286. <p>To give you a better sense of how this new feature works, here&rsquo;s a short demo. To start, we&rsquo;ll initialize a repository in SHA-256 mode, and declare that SHA-1 is our compatibility hash function:</p>
  287. <pre><code>$ git init --object-format=sha256 /path/to/repo
  288. Initialized empty Git repository in /path/to/repo/.git
  289. $ cd /path/to/repo
  290. $ git config extensions.compatObjectFormat sha1
  291. </code></pre>
  292. <p>Then, we can create a simple commit with a single file (<code>README</code>) whose contents are &ldquo;Hello, world!&rdquo;:</p>
  293. <pre><code>$ echo 'Hello, world!' &gt;README
  294. $ git add README
  295. $ git commit -m "initial commit"
  296. [main (root-commit) 74dcba4] initial commit
  297. Author: A U Thor &lt;author@example.com&gt;
  298. 1 file changed, 1 insertion(+)
  299. create mode 100644 README
  300. </code></pre>
  301. <p>Now, we can ask Git to show us the contents of the commit object we just created with <code>cat-file</code>. As we&rsquo;d expect, the hash of the commit object, as well as its root tree are computed using SHA-256:</p>
  302. <pre><code>$ git rev-parse HEAD | git cat-file --batch
  303. 74dcba4f8f941a65a44fdd92f0bd6a093ad78960710ac32dbd4c032df66fe5c6 commit 202
  304. tree ace45d916e870ce0fadbb8fc579218d01361da4159d1e2b5949f176b1f743280
  305. author A U Thor &lt;author@example.com&gt; 1713990043 -0400
  306. committer C O Mitter &lt;committer@example.com&gt; 1713990043 -0400
  307.  
  308. initial commit
  309. </code></pre>
  310. <p>But we can also tell <code>git rev-parse</code> to output any object IDs using the compatibility hash function, allowing us to ask for the SHA-1 object ID of that same commit object. When we print its contents out using <code>cat-file</code>, its root tree OID is a different value (starting with <code>7dd4941980</code> instead of <code>ace45d916e</code>), this time computed using SHA-1 instead of SHA-256:</p>
  311. <pre><code>$ git rev-parse --output-object-format=sha1 HEAD
  312. 2a4f4a2182686157a2dc887c46693c988c912533
  313.  
  314. $ git rev-parse --output-object-format=sha1 HEAD | git cat-file --batch
  315. 2a4f4a2182686157a2dc887c46693c988c912533 commit 178
  316. tree 7dd49419807b37a3afd2f040891a64d69abb8df1
  317. author A U Thor &lt;author@example.com&gt; 1713990043 -0400
  318. committer C O Mitter &lt;committer@example.com&gt; 1713990043 -0400
  319.  
  320. initial commit
  321. </code></pre>
  322. <p>Support for this new feature is still considered experimental, and many features may not work quite as you expect them to. There is still much work ahead for full interoperability between SHA-1 and SHA-256 repositories, but this release delivers an important first step towards full interoperability support.</p>
  323. <p>[<a href="https://github.com/git/git/compare/c75fd8d8150afdf836b63a8e0534d9b9e3e111ba...7673ecd2dcdcf0aae01cccdb5c25f9b96160a8c0">source</a>]</p>
  324. <hr>
  325. <ul>
  326. <li>If you&rsquo;ve ever scripted around your repository, then you have no doubt used <code>git rev-list</code> to list commits or objects reachable from some set of inputs. <code>rev-list</code> can also come in handy when trying to diagnose repository corruption, including investigating missing objects.
  327. <p>In the past, you might have used something like <code>git rev-list --missing=print</code> to gather a list of objects which are reachable from your inputs, but are missing from the local repository. But what if there are missing objects at the tips of your reachability query itself? For instance, if the tip of some branch or tag is corrupt, then you&rsquo;re stuck:</p>
  328. <pre><code>$ git rev-parse HEAD | tr 'a-f1-9' '1-9a-f' &gt;.git/refs/heads/missing
  329. $ git rev-list --missing=print --all | grep '^?'
  330. fatal: bad object refs/heads/missing
  331. </code></pre>
  332. <p>Here, Git won&rsquo;t let you continue, since one of the inputs to the reachability query itself (<code>refs/heads/missing</code>, via <code>--all</code>) is missing. This can make debugging missing objects in the reachable parts of your history more difficult than necessary.</p>
  333. <p>But with Git 2.45, you can debug missing objects even when the tips of your reachability query are themselves missing, like so:</p>
  334. <pre><code>$ git rev-list --missing=print --all | grep '^?'
  335. ?70678e7afeacdcba1242793c3d3d28916a2fd152
  336. </code></pre>
  337. <p>[<a href="https://github.com/git/git/compare/2c206fc82abb3ae3d8a5fb5b3c07c1a933007f31...a4324babe679352a801310f8e30f3cbcd9c1f16b">source</a>]</p>
  338. </li>
  339. <li>
  340. <p>One of Git&rsquo;s lesser-known features are &ldquo;reference logs,&rdquo; or &ldquo;<a href="https://git-scm.com/docs/git-reflog">reflogs</a>&rdquo; for short. These reference logs are extremely useful when asking questions about the history of some reference, such as: &ldquo;what was main pointing at two weeks ago?&rdquo; or &ldquo;where was I before I started this rebase?&rdquo;.</p>
  341. <p>Each reference has its own corresponding reflog, and you can use the <code>git reflog</code> command to see the reflog for the currently checked-out reference, or for an arbitrary reference by running <code>git reflog refs/heads/some/branch</code>.</p>
  342. <p>If you want to see what branches have corresponding reflogs, you could look at the contents of .git/logs like so:</p>
  343. <pre><code>$ find .git/logs/refs/heads -type f | cut -d '/' -f 3-
  344. </code></pre>
  345. <p>But what if you&rsquo;re using reftable? In that case, the reflogs are stored in a binary format, leaving tools like <code>find</code> out of your reach.</p>
  346. <p>Git 2.45 introduced a new sub-command <code>git reflog list</code> to show which references have corresponding reflogs available to them, regardless of whether or not you are using reftable.</p>
  347. <p>[<a href="https://github.com/git/git/compare/221c3daef41bdd7eebd5f45d711e847d0a85aa86...d699d15c328b03fd822d3950f7ed76debef02c26">source</a>]</p>
  348. </li>
  349. <li>
  350. <p>If you&rsquo;ve ever looked closely at Git&rsquo;s diff output, you might have noticed the prefixes <code>a/</code> and <code>b/</code> used before file paths to indicate the before and after versions of each file, like so:</p>
  351. <pre><code>$ git diff HEAD^ -- GIT-VERSION-GEN
  352. diff --git a/GIT-VERSION-GEN b/GIT-VERSION-GEN
  353. index dabd2b5b89..c92f98b3db 100755
  354. --- a/GIT-VERSION-GEN
  355. +++ b/GIT-VERSION-GEN
  356. @@ -1,7 +1,7 @@
  357. #!/bin/sh
  358.  
  359. GVF=GIT-VERSION-FILE
  360. -DEF_VER=v2.45.0-rc0
  361. +DEF_VER=v2.45.0-rc1
  362.  
  363. LF='
  364. '
  365. </code></pre>
  366. <p>In Git 2.45, you can now configure alternative prefixes by setting the <code>diff.srcPrefix</code> and <code>diff.dstPrefix</code> configuration options. This can come in handy if you want to make clear which side is which (by setting them to something like &ldquo;before&rdquo; and &ldquo;after,&rdquo; respectively). Or if you&rsquo;re viewing the output in your terminal, and your terminal supports hyperlinking to paths, you could change the prefix to <code>./</code> to allow you to click on filepaths within a diff output.</p>
  367. <p>[<a href="https://github.com/git/git/compare/1002f28a527d33893f7dab068dbac7011f84af65...178401dc25cf8c3f1a716b852b14dafa79367646">source</a>]</p>
  368. </li>
  369. <li>
  370. <p>When writing a commit message, Git will open your editor with a mostly blank file containing some instructions, like so:</p>
  371. <pre><code># Please enter the commit message for your changes. Lines starting
  372. # with '#' will be ignored, and an empty message aborts the commit.
  373. #
  374. # On branch main
  375. # Your branch is up to date with 'origin/main.
  376. </code></pre>
  377. <p><a href="https://github.com/git/git/compare/bcd45b4085f9269a536c8fb1963ac8380bfac0e8...eff80a9fd990de3605063050dae32f969ef18ba8">Since 2013</a>, Git has supported customizing the comment character to be something other than the default #. This can come in handy, for instance, if you&rsquo;re trying to refer to a GitHub issue by its numeric shorthand (e.g. <code>#12345</code>). If you write <code>#12345</code> at the beginning of a line in your commit message, Git will treat the entire line as a comment and ignore it.</p>
  378. <p>In Git 2.45, Git allows not just any single ASCII character, but any arbitrary multi-byte character or even an arbitrary string. Now, you can customize your commit message template by setting <code>core.commentString</code> (or <code>core.commentChar</code>, the two are synonyms for one another) to your heart&rsquo;s content.</p>
  379. <p>[<a href="https://github.com/git/git/compare/3256584c36f649abb2af58e7b190d3cf674ba56e...9ccf3e9b22b6843892319b189fd7aed37c451420">source</a>]</p>
  380. </li>
  381. <li>
  382. <p>Speaking of comments, <code>git config</code> learned a new option to help document your <code>.gitconfig</code> file. The <code>.gitconfig</code> file format allows for comments beginning with a <code>#</code> character, meaning that everything following that <code>#</code> until the next newline will be ignored.</p>
  383. <p>The <code>git config</code> command gained a new <code>--comment</code> option, which allows specifying an optional comment to leave at the end of the newly configured line, like so:</p>
  384. <pre><code>$ git config --comment 'to show the merge base' merge.conflictStyle diff3
  385. $ tail -n 2 .git/config
  386. [merge]
  387. conflictStyle = diff3 # to show the merge base
  388. </code></pre>
  389. <p>This can be helpful when tweaking some of Git&rsquo;s more esoteric settings to try and remember why you picked a particular value.</p>
  390. <p>[<a href="https://github.com/git/git/compare/7774cfed6261ce2900c84e55906da708c711d601...31399a6b6166cf76cc533bc9915878211607ed80">source</a>]</p>
  391. </li>
  392. <li>
  393. <p>Sometimes when you are rebasing or cherry-picking a series of commits, one or more of those commits become &ldquo;empty&rdquo; (i.e., because they contain a subset of changes that have already landed on your branch).</p>
  394. <p>When rebasing, you can use the <code>--empty</code> option to specify how to handle these commits. <code>--empty</code> supports a few options: &ldquo;drop&rdquo; (to ignore those commits), &ldquo;keep&rdquo; (to keep empty commits), or &ldquo;stop&rdquo; which will halt the rebase and ask for your input on how to proceed.</p>
  395. <p>Despite its similarity to <code>git rebase</code>, <code>git cherry-pick</code> never had an equivalent option to <code>--empty</code>. That meant that if you were cherry-picking a long sequence of commits, some of which became empty, you&rsquo;d have to type either <code>git cherry-pick --skip</code> (to drop the empty commit), or <code>git commit --allow-empty</code> (to keep the empty commit).</p>
  396. <p>In Git 2.45, <code>git cherry-pick</code> learned the same <code>--empty</code> option from <code>git rebase</code>, meaning that you can specify the behavior once at the beginning of your <code>cherry-pick</code> operation, instead of having to specify the same thing each time you encounter an empty commit.</p>
  397. <p>[<a href="https://github.com/git/git/compare/d988e80bd3a24387c74810b187a47813f8460699...ec79d763de617905bd9275de0b5941a160d6159b">source</a>]</p>
  398. </li>
  399. </ul>
  400. <h2 id="the-rest-of-the-iceberg" id="the-rest-of-the-iceberg" >The rest of the iceberg<a href="#the-rest-of-the-iceberg" class="heading-link pl-2 text-italic text-bold" aria-label="The rest of the iceberg"></a></h2>
  401. <p>That&rsquo;s just a sample of changes from the latest release. For more, check out the release notes for <a href="https://github.com/git/git/blob/v2.45.0/Documentation/RelNotes/2.45.0.txt">2.45</a>, or <a href="https://github.com/git/git/tree/v2.45.0/Documentation/RelNotes">any previous version</a> in <a href="https://github.com/git/git">the Git repository</a>.</p>
  402. </body></html>
  403. <p>The post <a href="https://github.blog/2024-04-29-highlights-from-git-2-45/">Highlights from Git 2.45</a> appeared first on <a href="https://github.blog">The GitHub Blog</a>.</p>
  404. ]]></content:encoded>
  405. <post-id xmlns="com-wordpress:feed-additions:1">77738</post-id> </item>
  406. <item>
  407. <title>GitHub Copilot Workspace: Welcome to the Copilot-native developer environment</title>
  408. <link>https://github.blog/2024-04-29-github-copilot-workspace/</link>
  409. <dc:creator><![CDATA[Thomas Dohmke]]></dc:creator>
  410. <pubDate>Mon, 29 Apr 2024 16:00:02 +0000</pubDate>
  411. <category><![CDATA[Product]]></category>
  412. <category><![CDATA[generative AI]]></category>
  413. <category><![CDATA[GitHub Copilot]]></category>
  414. <category><![CDATA[GitHub Enterprise]]></category>
  415. <guid isPermaLink="false">https://github.blog/?p=77597</guid>
  416.  
  417. <description><![CDATA[<p>We’re redefining the developer environment with GitHub Copilot Workspace - where any developer can go from idea, to code, to software all in natural language. </p>
  418. <p>The post <a href="https://github.blog/2024-04-29-github-copilot-workspace/">GitHub Copilot Workspace: Welcome to the Copilot-native developer environment</a> appeared first on <a href="https://github.blog">The GitHub Blog</a>.</p>
  419. ]]></description>
  420. <content:encoded><![CDATA[<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
  421. <html><body><div class="content-table-wrap"><table style="border: 1px black">
  422. <tbody>
  423. <tr>
  424. <td>We&rsquo;re redefining the developer environment with GitHub Copilot Workspace&ndash;where any developer can go from idea, to code, to software in natural language. <a href="https://githubnext.com/projects/copilot-workspace">Sign up here</a>. </td>
  425. </tr>
  426. </tbody>
  427. </table></div>
  428. <p>In the past two years, generative AI has foundationally changed the developer landscape largely as a tool embedded inside the developer environment. In 2022, we launched GitHub Copilot as an autocomplete pair programmer in the editor, <a href="https://github.blog/2022-09-07-research-quantifying-github-copilots-impact-on-developer-productivity-and-happiness/">boosting developer productivity by up to 55%</a>. Copilot is now the most widely adopted AI developer tool. In 2023, we released GitHub Copilot Chat&mdash;unlocking the power of natural language in coding, debugging, and testing&mdash;allowing developers to converse with their code in real time.</p>
  429. <p>After sharing <a href="https://github.blog/2023-11-08-universe-2023-copilot-transforms-github-into-the-ai-powered-developer-platform/">an early glimpse</a> at GitHub Universe last year, today, we are reimagining the nature of the developer experience itself with the technical preview of GitHub Copilot Workspace: the Copilot-native developer environment. Within Copilot Workspace, developers can now brainstorm, plan, build, test, and run code in natural language. This new task-centric experience leverages different Copilot-powered agents from start to finish, while giving developers full control over every step of the process.</p>
  430. <div class="mod-vh position-relative" style="height: 0; padding-bottom: calc((9 / 16)*100%);">
  431. <iframe loading="lazy" class="position-absolute top-0 left-0 width-full height-full" src="https://www.youtube.com/embed/pkotufZchjE?version=3&amp;rel=1&amp;showsearch=0&amp;showinfo=1&amp;iv_load_policy=1&amp;fs=1&amp;hl=en-US&amp;autohide=2&amp;wmode=transparent" title="YouTube video player" allow="accelerometer; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen="" frameborder="0"></iframe>
  432. </div>
  433. <p>Copilot Workspace represents a radically new way of building software with natural language, and is expressly <a href="https://github.blog/2024-01-17-a-developers-second-brain-reducing-complexity-through-partnership-with-ai/">designed</a> to deliver&ndash;not replace&ndash;developer creativity, faster and easier than ever before. With Copilot Workspace we will empower more experienced developers to operate as systems thinkers, and materially lower the barrier of entry for who can build software.</p>
  434. <p>Welcome to the first day of a new developer environment. Here&rsquo;s how it works:</p>
  435. <h3 id="it-all-starts-with-the-task" id="it-all-starts-with-the-task" >It all starts with the task&hellip;<a href="#it-all-starts-with-the-task" class="heading-link pl-2 text-italic text-bold" aria-label="It all starts with the task&hellip;"></a></h3>
  436. <p><img decoding="async" src="https://github.blog/wp-content/uploads/2024/04/octoacademy-projects.png?w=1024&#038;resize=1024%2C593" alt="It starts with a task. Open GitHub Copilot Workspace from a GitHub Issue, Pull Request, or Repository. (Screenshot of an issue in the octoacademy repository.)" width="1024" height="593" class="aligncenter size-large wp-image-77599 width-fit" srcset="https://github.blog/wp-content/uploads/2024/04/octoacademy-projects.png?w=1600 1600w, https://github.blog/wp-content/uploads/2024/04/octoacademy-projects.png?w=300 300w, https://github.blog/wp-content/uploads/2024/04/octoacademy-projects.png?w=768 768w, https://github.blog/wp-content/uploads/2024/04/octoacademy-projects.png?w=1024&#038;resize=1024%2C593 1024w, https://github.blog/wp-content/uploads/2024/04/octoacademy-projects.png?w=1536 1536w" sizes="(max-width: 1000px) 100vw, 1000px" data-recalc-dims="1" /></p>
  437. <p>For developers, the greatest barrier to entry is almost always at the <a href="https://github.blog/2023-11-08-universe-2023-copilot-transforms-github-into-the-ai-powered-developer-platform/">beginning</a>. Think of how often you hit a wall in the first steps of a big project, feature request, or even bug report, simply because you don&rsquo;t know how to get started. GitHub Copilot Workspace meets developers right at the origin: a GitHub Repository or a GitHub Issue. By leveraging Copilot agents as a second brain, developers will have AI assistance from the very beginning of an idea.</p>
  438. <h3 id="workspace-builds-the-full-plan" id="workspace-builds-the-full-plan" >&hellip;Workspace builds the full plan<a href="#workspace-builds-the-full-plan" class="heading-link pl-2 text-italic text-bold" aria-label="&hellip;Workspace builds the full plan"></a></h3>
  439. <p><img loading="lazy" decoding="async" src="https://github.blog/wp-content/uploads/2024/04/3-Plan-of-Action-Zoom-with-BG.png?w=1024&#038;resize=1024%2C607" alt="Progress from your task to a specification, outlining what you want to achieve with Copilot Workspace. The steps are editable, enabling you to iterate on ideas." width="1024" height="607" class="aligncenter size-large wp-image-77744 width-fit" srcset="https://github.blog/wp-content/uploads/2024/04/3-Plan-of-Action-Zoom-with-BG.png?w=3642 3642w, https://github.blog/wp-content/uploads/2024/04/3-Plan-of-Action-Zoom-with-BG.png?w=300 300w, https://github.blog/wp-content/uploads/2024/04/3-Plan-of-Action-Zoom-with-BG.png?w=768 768w, https://github.blog/wp-content/uploads/2024/04/3-Plan-of-Action-Zoom-with-BG.png?w=1024&#038;resize=1024%2C607 1024w, https://github.blog/wp-content/uploads/2024/04/3-Plan-of-Action-Zoom-with-BG.png?w=1536 1536w, https://github.blog/wp-content/uploads/2024/04/3-Plan-of-Action-Zoom-with-BG.png?w=2048 2048w, https://github.blog/wp-content/uploads/2024/04/3-Plan-of-Action-Zoom-with-BG.png?w=3000 3000w" sizes="(max-width: 1000px) 100vw, 1000px" data-recalc-dims="1" /></p>
  440. <p>From there, Copilot Workspace offers a step-by-step plan to solve the issue based on its deep understanding of the codebase, issue replies, and more. It gives you everything you need to validate the plan, and test the code, in one streamlined list in natural language.</p>
  441. <h3 id="and-its-entirely-editable" id="and-its-entirely-editable" >And it&rsquo;s entirely editable&hellip;<a href="#and-its-entirely-editable" class="heading-link pl-2 text-italic text-bold" aria-label="And it&rsquo;s entirely editable&hellip;"></a></h3>
  442. <p><img loading="lazy" decoding="async" src="https://github.blog/wp-content/uploads/2024/04/copilot-workspace.png?w=1024&#038;resize=1024%2C593" alt="Then adjust your plan of action, adding steps, and general notes. Once the plan is implemented, you can view changes with a PR diff view and make edits as needed." width="1024" height="593" class="aligncenter size-large wp-image-77602 width-fit" srcset="https://github.blog/wp-content/uploads/2024/04/copilot-workspace.png?w=1600 1600w, https://github.blog/wp-content/uploads/2024/04/copilot-workspace.png?w=300 300w, https://github.blog/wp-content/uploads/2024/04/copilot-workspace.png?w=768 768w, https://github.blog/wp-content/uploads/2024/04/copilot-workspace.png?w=1024&#038;resize=1024%2C593 1024w, https://github.blog/wp-content/uploads/2024/04/copilot-workspace.png?w=1536 1536w" sizes="(max-width: 1000px) 100vw, 1000px" data-recalc-dims="1" /></p>
  443. <p>Everything that GitHub Copilot Workspace proposes&mdash;from the plan to the code&mdash;is fully editable, allowing you to iterate until you&rsquo;re confident in the path ahead. You retain all of the autonomy, while Copilot Workspace lifts your cognitive strain.</p>
  444. <p><img loading="lazy" decoding="async" src="https://github.blog/wp-content/uploads/2024/04/4.1-Run-code-in-Copilot-Workspace-v3.png?w=1024&#038;resize=1024%2C604" alt="Once you're happy with the code, you can use the integrated terminal to run unit tests, builds and appropriate checks." width="1024" height="604" class="aligncenter size-large wp-image-77745 width-fit" srcset="https://github.blog/wp-content/uploads/2024/04/4.1-Run-code-in-Copilot-Workspace-v3.png?w=3660 3660w, https://github.blog/wp-content/uploads/2024/04/4.1-Run-code-in-Copilot-Workspace-v3.png?w=300 300w, https://github.blog/wp-content/uploads/2024/04/4.1-Run-code-in-Copilot-Workspace-v3.png?w=768 768w, https://github.blog/wp-content/uploads/2024/04/4.1-Run-code-in-Copilot-Workspace-v3.png?w=1024&#038;resize=1024%2C604 1024w, https://github.blog/wp-content/uploads/2024/04/4.1-Run-code-in-Copilot-Workspace-v3.png?w=1536 1536w, https://github.blog/wp-content/uploads/2024/04/4.1-Run-code-in-Copilot-Workspace-v3.png?w=2048 2048w, https://github.blog/wp-content/uploads/2024/04/4.1-Run-code-in-Copilot-Workspace-v3.png?w=3000 3000w" sizes="(max-width: 1000px) 100vw, 1000px" data-recalc-dims="1" /></p>
  445. <p>And once you&rsquo;re satisfied with the plan, you can run your code directly in Copilot Workspace, jump into the underlying GitHub Codespace, and tweak all code changes until you are happy with the final result. You can also instantly share a workspace with your team via a link, so they can view your work and even try out their own iterations.</p>
  446. <p>All that&rsquo;s left then is to file your pull request, run your GitHub Actions, security code scanning, and ask your team members for human code review. And best of all, they can leverage your Copilot Workspace to see how you got from idea to code.</p>
  447. <div class="mod-vh position-relative" style="height: 0; padding-bottom: calc((9 / 16)*100%);">
  448. <iframe loading="lazy" class="position-absolute top-0 left-0 width-full height-full" src="https://www.youtube.com/embed/L5Xny6yehUg?version=3&amp;rel=1&amp;showsearch=0&amp;showinfo=1&amp;iv_load_policy=1&amp;fs=1&amp;hl=en-US&amp;autohide=2&amp;wmode=transparent" title="YouTube video player" allow="accelerometer; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen="" frameborder="0"></iframe>
  449. </div>
  450. <h3 id="also-github-copilot-workspace-is-mobile-compatible" id="also-github-copilot-workspace-is-mobile-compatible" >Also: GitHub Copilot Workspace is mobile compatible<a href="#also-github-copilot-workspace-is-mobile-compatible" class="heading-link pl-2 text-italic text-bold" aria-label="Also: GitHub Copilot Workspace is mobile compatible"></a></h3>
  451. <p>And because ideas can happen anywhere, GitHub Copilot Workspace was designed to be used from any device&mdash;empowering a real-world development environment that can work on a desktop, laptop, or on the go.</p>
  452. <div class="mod-vh position-relative" style="height: 0; padding-bottom: calc((9 / 16)*100%);">
  453. <iframe loading="lazy" class="position-absolute top-0 left-0 width-full height-full" src="https://www.youtube.com/embed/Zv6TuVzcRdY?version=3&amp;rel=1&amp;showsearch=0&amp;showinfo=1&amp;iv_load_policy=1&amp;fs=1&amp;hl=en-US&amp;autohide=2&amp;wmode=transparent" title="YouTube video player" allow="accelerometer; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen="" frameborder="0"></iframe>
  454. </div>
  455. <p>This is our mark on the future of the development environment: an intuitive, Copilot-powered infrastructure that makes it easier to get started, to learn, and ultimately to execute.</p>
  456. <h2 id="enabling-a-world-with-1b-developers" id="enabling-a-world-with-1b-developers" >Enabling a world with 1B developers<a href="#enabling-a-world-with-1b-developers" class="heading-link pl-2 text-italic text-bold" aria-label="Enabling a world with 1B developers"></a></h2>
  457. <p>Early last year, GitHub celebrated over <a href="https://github.blog/2023-01-25-100-million-developers-and-counting/">100 million developers</a> on our platform&mdash;and counting. As programming in natural language lowers the barrier of entry to who can build software, we are accelerating to a near future where <a href="https://www.sequoiacap.com/article/the-next-billion-developers-perspective/">one billion people</a> on GitHub will control a machine just as easily as they ride a bicycle. We&rsquo;ve constructed GitHub Copilot Workspace in pursuit of this horizon, as a conduit to help extend the economic opportunity and joy of building software to every human on the planet.</p>
  458. <p>At the same time, we live in a world dependent on&mdash;and in short supply of&mdash;professional developers. Around the world, developers add millions of lines of code every single day to evermore complex systems and are increasingly behind on maintaining the old ones. Just like any infrastructure in this world, we need real experts to maintain and renew the world&rsquo;s code. By quantifiably reducing boilerplate work, we will empower professional developers to increasingly operate as systems thinkers. We believe the step change in productivity gains that professional developers will experience by virtue of Copilot and now Copilot Workspace will only continue to <a href="https://github.blog/2023-06-27-the-economic-impact-of-the-ai-powered-developer-lifecycle-and-lessons-from-github-copilot/">increase labor demand</a>.</p>
  459. <p>That&rsquo;s the dual potential of GitHub Copilot: for the professional and hobbyist developer alike, channeling creativity into code just got a whole lot easier.</p>
  460. <div class="post-content-cta"><p><strong>Today, we begin the technical preview for GitHub Copilot Workspace.</strong><br /> <a href="https://githubnext.com/projects/copilot-workspace">Sign up now</a>. <br /> We can&rsquo;t wait to see what you will build from here.</p>
  461. </div>
  462. </body></html>
  463. <p>The post <a href="https://github.blog/2024-04-29-github-copilot-workspace/">GitHub Copilot Workspace: Welcome to the Copilot-native developer environment</a> appeared first on <a href="https://github.blog">The GitHub Blog</a>.</p>
  464. ]]></content:encoded>
  465. <post-id xmlns="com-wordpress:feed-additions:1">77597</post-id> </item>
  466. <item>
  467. <title>CodeQL zero to hero part 3: Security research with CodeQL</title>
  468. <link>https://github.blog/2024-04-29-codeql-zero-to-hero-part-3-security-research-with-codeql/</link>
  469. <dc:creator><![CDATA[Sylwia Budzynska]]></dc:creator>
  470. <pubDate>Mon, 29 Apr 2024 08:00:57 +0000</pubDate>
  471. <category><![CDATA[Security]]></category>
  472. <category><![CDATA[CodeQL]]></category>
  473. <category><![CDATA[GitHub Security Lab]]></category>
  474. <guid isPermaLink="false">https://github.blog/?p=77703</guid>
  475.  
  476. <description><![CDATA[<p>Learn how to use CodeQL for security research and improve your security research workflow.</p>
  477. <p>The post <a href="https://github.blog/2024-04-29-codeql-zero-to-hero-part-3-security-research-with-codeql/">CodeQL zero to hero part 3: Security research with CodeQL</a> appeared first on <a href="https://github.blog">The GitHub Blog</a>.</p>
  478. ]]></description>
  479. <content:encoded><![CDATA[<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
  480. <html><body><p>I&rsquo;ve written a bit in the past about static analysis (<a href="https://github.blog/2023-03-31-codeql-zero-to-hero-part-1-the-fundamentals-of-static-analysis-for-vulnerability-research/">CodeQL zero to hero part 1: Fundamentals of static analysis</a>) and basics of writing CodeQL queries (<a href="https://github.blog/2023-06-15-codeql-zero-to-hero-part-2-getting-started-with-codeql/">CodeQL zero to hero part 2: Getting started with CodeQL</a>). Today, I want to dig deeper about CodeQL and talk about variant analysis, writing a taint tracking query and various techniques for doing security research with CodeQL. As is with most IT skills, having practical, tangible experience with a tool will make it easier to remember and understand the concepts you learn, so this blog also contains challenges for each section. You will also find them in <a href="https://github.com/GitHubSecurityLab/codeql-zero-to-hero">GitHubSecurityLab/codeql-zero-to-hero</a>. Give them a try!</p>
  481. <p>I use CodeQL quite extensively in my security research workflow to find vulnerabilities. Most of my (as well as my fellow team members&rsquo;) <a href="https://securitylab.github.com/advisories/">disclosed vulnerabilities</a> will give you an idea what kind of vulnerabilities you can find using CodeQL. Let&rsquo;s jump in!</p>
  482. <h2 id="querying-for-specific-library-methods" id="querying-for-specific-library-methods" >Querying for specific library methods<a href="#querying-for-specific-library-methods" class="heading-link pl-2 text-italic text-bold" aria-label="Querying for specific library methods"></a></h2>
  483. <p>In the previous blog post we were matching function calls, functions, and method calls based on a name, for example, in this <a href="https://github.blog/2023-06-15-codeql-zero-to-hero-part-2-getting-started-with-codeql/#:~:text=Challenge%209%E2%80%94Find%20all%20functions%20with%20%E2%80%9Ccommand%E2%80%9D%20as%20part%20of%20its%20name">challenge</a>. It could happen though, that a certain method call is defined in several libraries, and we wanted to refine our results to only the method call from one specific library.</p>
  484. <p>For example, when auditing a new codebase, we might want to find calls to a specific library function or method, because we know it might be a new source or a sink (see <a href="https://github.blog/2023-03-31-codeql-zero-to-hero-part-1-the-fundamentals-of-static-analysis-for-vulnerability-research/#vulnerability-detection-sources-and-sinks">part one of this series</a>). We can do just that with static analysis and CodeQL. So, how do we write and query for specific library methods? Let&rsquo;s take our earlier example and say we are auditing a Django application for SQL injection and we are interested in <code>execute()</code> calls that come from, and only from, <code>django.db.connection.cursor()</code>.</p>
  485. <p>To execute custom SQL directly in django we need to grab the cursor object by calling <code>connection.cursor()</code> from the <code>django.db.connection</code>, on which we call <code>execute()</code>. Generally, it would look like this:</p>
  486. <pre><code>from django.conf.urls import url
  487. from django.db import connection
  488.  
  489.  
  490. def show_user(request, username):
  491.    with connection.cursor() as cursor:
  492.        cursor.execute("SELECT * FROM users WHERE username = %s" % username)
  493. </code></pre>
  494. <p>In CodeQL for Python, we use the <a href="https://codeql.github.com/codeql-standard-libraries/python/semmle/python/ApiGraphs.qll/module.ApiGraphs.html">API graphs</a> library to refer to external library functions and classes. For dynamic languages, we cannot uniquely determine the type of a given variable due to their dynamic nature, and, therefore, the API graph layer offers the mechanism to track types from their import to potential uses.</p>
  495. <p>We can find all  <code>execute</code> method calls from the <code>django.db</code> library with the following query.</p>
  496. <pre><code>/**
  497. * @id codeql-zero-to-hero/3-1
  498. * @severity error
  499. * @kind problem
  500. */
  501.  
  502. import python
  503. import semmle.python.ApiGraphs
  504.  
  505. from API::CallNode node
  506. where node =
  507.    API::moduleImport("django").getMember("db").getMember("connection").getMember("cursor").getReturn().getMember("execute").getACall()
  508.    and
  509.    node.getLocation().getFile().getRelativePath().regexpMatch("2/challenge-1/.*")
  510.  
  511. select node, "Call to django.db execute"
  512. </code></pre>
  513. <p>Let&rsquo;s walk through what is happening in the query.</p>
  514. <p>First, we set query <a href="https://codeql.github.com/docs/writing-codeql-queries/metadata-for-codeql-queries/">metadata</a>. The most interesting part of it is <code>@kind problem</code>. It means that the results for each node will contain the filename the sink was found in, and the string that we specify in the <code>select</code> clause. All in all, it makes the results display prettier.</p>
  515. <p>Then, we define that we are looking for <a href="https://codeql.github.com/codeql-standard-libraries/python/semmle/python/ApiGraphs.qll/type.ApiGraphs%24API%24CallNode.html"><code>API::CallNode</code></a>s, so nodes that are connected to the API graph (see docs for the <a href="https://codeql.github.com/codeql-standard-libraries/python/semmle/python/ApiGraphs.qll/module.ApiGraphs%24API.html">API</a> module) in the <code>from</code> clause.</p>
  516. <p>In the <code>where</code> clause, we filter for <code>nodes</code> coming from the <code>django</code> library with <code>API::moduleImport("django")</code>. Then, we find references to the <code>cursor</code> with <code>.getMember("db").getMember("connection").getMember("cursor")</code>. That would match <code>django.db.connection.cursor</code>. Since we call <code>execute</code> on the <code>cursor</code> object, we first need to use <code>getReturn()</code> predicate to get the node which represents the result of creating the cursor object&mdash;this returns us <code>django.db.connection.cursor()</code> (note the parentheses at the end). At last, we get the node representing the <code>execute</code> method with <code>getMember("execute")</code> and with <code>getACall()</code> we get the actual method call to the method represented by the <code>execute</code> node.</p>
  517. <p>It might look complicated at first, but it isn&rsquo;t really. After using it a few times it becomes quite intuitive.</p>
  518. <details>
  519. <summary><strong>Challenge 1&mdash;Find all method calls that are called &lsquo;execute&rsquo; and come from the <code>django.db</code> library</strong></summary>
  520. <p>Set up CodeQL using one of the methods presented in <a href="https://github.com/GitHubSecurityLab/codeql-zero-to-hero/blob/main/2/challenge-2/instructions.md">challenge 2</a> from CodeQL zero to hero part 2 to run the queries. Remember also to download and <a href="https://github.com/GitHubSecurityLab/codeql-zero-to-hero/blob/main/2/challenge-2/instructions.md#select-codeql-database">select a CodeQL database</a>&mdash;it can be the GitHubSecurityLab/codeql-zero-to-hero database, but you may also choose another project.</p>
  521. <p>Run the above query to find all method calls that are called <code>execute</code> and come from the <code>django.db</code> library.</p>
  522. <p>If the path is not displaying properly, you may need to change the view to <code>alerts</code>.</p>
  523. <p><img loading="lazy" decoding="async" src="https://github.blog/wp-content/uploads/2024/04/codeql-query-results.png?w=168&#038;resize=168%2C127" alt='Change the view on your CodeQL query results to "alert."' width="168" height="127" class="aligncenter size-large wp-image-77713 width-fit" data-recalc-dims="1"></p>
  524. </details>
  525. <details>
  526. <summary><strong>Challenge 2&mdash;Write a query to find all <code>os.system</code> method calls</strong></summary>
  527. <p>Now you know how to query for calls to functions from specific libraries. If <code>os.system</code> executes input coming from a user, it could lead to a command injection. Write a query to find calls to <code>os.system</code> and run it on the database you selected in the previous challenge.</p>
  528. <p>See solution in <a href="https://github.com/GitHubSecurityLab/codeql-zero-to-hero">GitHubSecurityLab/codeql-zero-to-hero</a>.</p>
  529. </details>
  530. <details>
  531. <summary><strong>Challenge 3&mdash;Write a query to find all Flask requests</strong></summary>
  532. <p>Flask is a popular Python web framework. Web frameworks very often introduce potential sources for untrusted data, <a href="https://flask.palletsprojects.com/en/3.0.x/api/#incoming-request-data">Flask request</a> being one of them. For example, a source of untrusted data could be:</p>
  533. <pre><code>
  534. username = request.args.get("username")
  535. </code></pre>
  536.  
  537. <p>Write a query to find <code>request.args</code></p>
  538. <p>See solution in <a href="https://github.com/GitHubSecurityLab/codeql-zero-to-hero">GitHubSecurityLab/codeql-zero-to-hero</a>.</p>
  539. </details>
  540. <aside class="p-4 p-md-6 post-aside--large"><p class="h5-mktg gh-aside-title">Get all QL types matching a given result</p><p>There are different types in CodeQL to represent different aspects of a codebase. For example, functions in CodeQL for Python have a Function type or string literals, which in CodeQL for Python have a Str type. If you are not certain with what QL types some results might have, you can use the <code>getAQlClass</code> predicate. As an example, we could add the <code>getAQlClass</code> predicate to the results of our previous query&mdash;all <code>django.db</code>&rsquo;s calls to execute.</p>
  541. <pre><code>
  542. /**
  543. * @id codeql-zero-to-hero/3-4
  544. * @severity error
  545. * @kind problem
  546. */
  547. import python
  548. import semmle.python.ApiGraphs
  549.  
  550. from API::CallNode node
  551. where node = API::moduleImport("django").getMember("db").getMember("connection").getMember("cursor").getReturn().getMember("execute").getACall()
  552. select node, "The node has type " + node.getAQlClass()
  553. </code></pre>
  554. <p>A single node will often have many QL classes, so if you run this query, you will see a lot of results, such as <code>MethodCallNode</code>, <code>ExecuteMethodCall</code> and <code>SqlExecution</code>. If you are having issues with querying what you might need, <code>getAQlClass</code> predicate can be a very helpful debugging tool to use, but remember not to use it in the final query, because using <code>getAQlClass</code> can affect query performance. In some languages, for example, Java, you may want to use the getAPrimaryQlClass predicate, which returns the primary CodeQL class to which a given element belongs. See also other ideas for debugging.</p>
  555. </aside>
  556. <details>
  557. <summary><strong>Challenge 4&mdash; Run the query with <code>getAQlClass</code> predicate</strong></summary>
  558. <p>Run the above query and observe the results&mdash;for example, <code>MethodCallNode</code>, <code>ExecuteMethodCall</code> and <code>SqlExecution</code>.<br>
  559. </p></details>
  560. </p><h2 id="taint-analysis-in-codeql-taint-tracking" id="taint-analysis-in-codeql-taint-tracking" >Taint analysis in CodeQL&mdash;taint tracking<a href="#taint-analysis-in-codeql-taint-tracking" class="heading-link pl-2 text-italic text-bold" aria-label="Taint analysis in CodeQL&mdash;taint tracking"></a></h2>
  561. <p>I <a href="https://github.blog/2023-06-15-codeql-zero-to-hero-part-2-getting-started-with-codeql/">briefly mentioned</a> how CodeQL implements taint analysis in part two of CodeQL zero to hero. There was also a challenge presenting how to run the built-in CodeQL queries using taint analysis, which you should definitely try out!</p>
  562. <p>Now that we went through the basics of CodeQL, we can write our own query that will find the flow from the source to the sink.</p>
  563. <p>But first, let&rsquo;s start with the differences between data flow analysis and taint flow analysis. Taint flow analysis allows us to track non-value preserving steps. Data flow analysis does not. For example, if a tainted string is concatenated with another string or if it is assigned to an attribute of an object, taint flow analysis will allow us to continue tracking it through the flow, while data flow analysis will not. See <a href="https://github.blog/2023-03-31-codeql-zero-to-hero-part-1-the-fundamentals-of-static-analysis-for-vulnerability-research/#data-flow-analysis-and-taint-tracking">CodeQL zero to hero part 1</a> for more information about data flow analysis and taint analysis.</p>
  564. <h3 id="local-data-flow" id="local-data-flow" >Local data flow<a href="#local-data-flow" class="heading-link pl-2 text-italic text-bold" aria-label="Local data flow"></a></h3>
  565. <p>Before we dig into taint analysis, we need to introduce two (sub)types of data flow analysis: local data flow and global data flow, as well as local taint flow and global taint flow.</p>
  566. <p>In CodeQL, local data flow refers to tracking the data flow locally, for example, within a single function. It is cheaper to compute than global data flow. Local taint flow (in CodeQL called local taint tracking) allows us to track non-value-preserving flow steps.</p>
  567. <p>For example, with local data flow, we could make our analysis more accurate by querying for all <code>django.db</code>&rsquo;s <code>execute</code> calls that do not take a string literal. If an <code>execute</code> call takes a string literal, for example:</p>
  568. <pre><code>cursor.execute("SELECT * FROM users WHERE username = 'johndoe'")
  569. </code></pre>
  570. <p>Or:</p>
  571. <pre><code>query = "SELECT * FROM users WHERE username = 'johndoe'"
  572. cursor.execute(query)
  573. </code></pre>
  574. <p>Then, it does not take any user input, and we already know it is not vulnerable to SQL injection and we might want to exclude these from our analysis.</p>
  575. <p>We could query for all <code>django.db</code>&rsquo;s <code>execute</code> calls that do not take a string literal, with the below query:</p>
  576. <pre><code>/**
  577. * @id codeql-zero-to-hero/3-5
  578. * @severity error
  579. * @kind problem
  580. */
  581. import python
  582. import semmle.python.ApiGraphs
  583.  
  584. class ExecuteCall extends DataFlow::CallCfgNode {
  585.        ExecuteCall() {
  586.        this = API::moduleImport("django").getMember("db").getMember("connection").getMember("cursor").getReturn().getMember("execute").getACall()
  587.        }
  588. }
  589.  
  590. predicate executeNotLiteral(DataFlow::CallCfgNode call) {
  591.        exists(DataFlow::ExprNode expr |
  592.                call instanceof ExecuteCall
  593.                and DataFlow::localFlow(expr, call.getArg(0))
  594.                and expr instanceof DataFlow::LocalSourceNode
  595.                and not expr.getNode().isLiteral()
  596.        )
  597. }
  598.  
  599. from DataFlow::CallCfgNode call
  600. where executeNotLiteral(call)
  601. select call, "Call to django.db execute with an argument that is not a literal"
  602. </code></pre>
  603. <p>To spice things up, this time I used a class and a predicate. A <a href="https://codeql.github.com/docs/ql-language-reference/types/#classes-1">class</a> allows you to define your own types in CodeQL. Types represent sets of values. A <a href="https://codeql.github.com/docs/ql-language-reference/predicates/">predicate</a> is like a function. It encapsulates a portion of logic in a program and makes it easier to test certain code. Classes and predicates were <a href="https://github.blog/2023-06-15-codeql-zero-to-hero-part-2-getting-started-with-codeql/#predicates">introduced</a> in the previous blog.</p>
  604. <p>Let&rsquo;s do our usual dance with explaining the query &#128131;:</p>
  605. <ul>
  606. <li>The class <code>ExecuteCall</code> represents <code>django.db</code>&rsquo;s <code>execute</code> method call that we modeled earlier.</li>
  607. <li>The predicate <code>executeNotLiteral</code> takes an input&mdash;a call control flow graph node <code>call</code>.</li>
  608. <li>In the predicate, we use the  <code>exists()</code> construct, which allows us to define local variables. Here we define an <code>ExprNode</code>, which is an expression.</li>
  609. <li>We specify that the <code>call</code> has to be any call node of type <code>ExecuteCall</code>.</li>
  610. <li>Then, we look for local flow between any expression <code>expr</code> and the first argument of <code>call.</code></li>
  611. <li>Next, we limit the expression <code>expr</code> to any local sources, for example, within a function.</li>
  612. <li>At last, with <code>not expr.getNode().isLiteral()</code> we limit the local sources to not be a literal of any kind: integer, string, etc.</li>
  613. <li>In the <code>from-where-select</code> query, we specify that we are looking for any call (<code>from DataFlow::CallCfgNode call</code>), then limit it to the conditions defined in the predicate (<code>where executeNotLiteral(call)</code>), and then select that call (<code>select call</code>).</li>
  614. </ul>
  615. <p>Note again that CodeQL is a declarative language&mdash;the order of specifying conditions does not matter. In the predicate, we first looked for a local flow from any expression to any first argument to <code>execute</code> and only afterwards we limited <code>expr</code> to be a <code>LocalSourceNode</code> and not a literal. That's not a problem; we can switch the order of conditions as we like.</p>
  616. <details>
  617. <summary><strong>Challenge 5&mdash;Run the local data flow query to find <code>execute</code> calls that do not take a string literal</strong></summary>
  618. <p>If we used, for example,  <code>grep</code> to find anything called <code>execute</code>, we might have found calls from other libraries that are also called <code>execute</code> and we wouldn&rsquo;t have been able to filter out the ones with a string literal.</p>
  619. </details>
  620. <h3 id="global-data-flow-and-global-taint-flow" id="global-data-flow-and-global-taint-flow" >Global data flow (and global taint flow)<a href="#global-data-flow-and-global-taint-flow" class="heading-link pl-2 text-italic text-bold" aria-label="Global data flow (and global taint flow)"></a></h3>
  621. <p>In CodeQL, global data flow refers to tracking the data flow throughout the whole codebase. We do this by using a taint tracking configuration, where we specify a source and a sink to find the flows between the two.</p>
  622. <p>Global taint flow is exactly what we use in most of our queries to find variants of vulnerabilities in codebases. You can see all the queries that we use in the <a href="https://github.com/github/codeql">github/codeql</a> repository. For example, CodeQL for Python stores all its security related queries in the <code>python/ql/src/Security/</code> folder and experimental queries in the <a href="https://github.com/github/codeql/tree/main/python/ql/src/experimental/Security">python/ql/src/experimental/Security</a> folder.</p>
  623. <p>In August 2023, a new, improved version of <a href="https://github.blog/changelog/2023-08-14-new-dataflow-api-for-writing-custom-codeql-queries/">taint tracking API was announced</a>, which means that we have two ways of writing the configuration. The older version will be deprecated within two or so years, so it&rsquo;s preferred that you use the new API. I&rsquo;m going to mention both versions in this blog post for clarity, because there are many older blog posts about CodeQL, which use the old configuration.</p>
  624. <h2 id="new-taint-tracking-api" id="new-taint-tracking-api" >New taint tracking API<a href="#new-taint-tracking-api" class="heading-link pl-2 text-italic text-bold" aria-label="New taint tracking API"></a></h2>
  625. <p>Let&rsquo;s start by looking at the way we write the new taint tracking configuration:</p>
  626. <pre><code>/**
  627. * @kind path-problem
  628. */
  629.  
  630. import python
  631. import semmle.python.dataflow.new.DataFlow
  632. import semmle.python.dataflow.new.TaintTracking
  633. import semmle.python.ApiGraphs
  634. import MyFlow::PathGraph
  635.  
  636. private module MyConfig implements DataFlow::ConfigSig {
  637.  predicate isSource(DataFlow::Node source) {
  638.    // Define your source nodes here.
  639.  }
  640.  
  641.  predicate isSink(DataFlow::Node sink) {
  642.    // Define your sink nodes here.
  643.  }
  644. }
  645.  
  646. module MyFlow = TaintTracking::Global&lt;MyConfig&gt;; // or DataFlow::Global&lt;..&gt;
  647.  
  648. from MyFlow::PathNode source, MyFlow::PathNode sink
  649. where MyFlow::flowPath(source, sink)
  650. select sink.getNode(), source, sink, "Sample TaintTracking query"
  651. </code></pre>
  652. <p>A few things to note:</p>
  653. <ul>
  654. <li>To be able to see the path between source and a sink, we add <code>@kind path-problem</code> in the <a href="https://codeql.github.com/docs/writing-codeql-queries/metadata-for-codeql-queries/">metadata</a>. This makes it a so-called &ldquo;path query.&rdquo;</li>
  655. <li>For results to be displayed properly, the <code>select</code> needs 3 nodes and a comment string, here implemented with <code>select sink.getNode(), source, sink, "Sample TaintTracking query"</code>.</li>
  656. <li>Note we also need to import the module that we create with <code>import MyFlow::PathGraph</code>.</li>
  657. </ul>
  658. <p>What is happening in the query:</p>
  659. <ol>
  660. <li>We create a new module <code>MyConfig</code> which implements <code>DataFlow::ConfigSig</code>. This means that it can be used as an input configuration for data flow and that we must define some predicates with certain names and numbers of arguments in the module. </li>
  661. <li>The required predicates are <code>isSource</code> and <code>isSink</code>. We define the sources in the <code>isSource</code> predicate and sinks in the <code>isSink</code> predicate. There are optional predicates, like <code>isBarrier</code> and <code>isAdditionalFlowStep</code>, which can be used to adjust what flow is considered (see more in the <a href="https://codeql.github.com/docs/codeql-language-guides/analyzing-data-flow-in-python/#using-global-data-flow">documentation</a>), but they are beyond the scope of this blog post.</li>
  662. <li>Next, we create a global TaintTracking computation, <code>MyFlow</code>, by parameterizing <code>TaintTracking::Global</code> using the sources and sinks we've defined in <code>MyConfig</code> in the line <code>module MyFlow = TaintTracking::Global&lt;MyConfig&gt;</code>.</li>
  663. <li>At last, we check that there is a flow path between the source and the sink with <code>where MyFlow::flowPath(source, sink).</code></li>
  664. </ol>
  665. <p>Now that we know the building blocks, let&rsquo;s try to use it. Let's say we want to find a SQL injection from any user input to <code>django.db</code> &rsquo;s <code>execute</code> sink.</p>
  666. <p>We could use a Flask request as a source. It is fairly easy to model. Then, we can reuse the <code>execute</code> sink we already modeled in the previous sections.</p>
  667. <p>The final query will look like this:</p>
  668. <pre><code>/**
  669. * @kind path-problem
  670. * @problem.severity error
  671. * @id githubsecuritylab/3-6
  672. */
  673.  
  674. import python
  675. import semmle.python.dataflow.new.DataFlow
  676. import semmle.python.dataflow.new.TaintTracking
  677. import semmle.python.ApiGraphs
  678. import semmle.python.dataflow.new.RemoteFlowSources
  679. import MyFlow::PathGraph
  680.  
  681. class ExecuteCall extends DataFlow::CallCfgNode {
  682.    ExecuteCall() {
  683.    this = API::moduleImport("django").getMember("db").getMember("connection").getMember("cursor").getReturn().getMember("execute").getACall()
  684.    }
  685. }
  686.  
  687. private module MyConfig implements DataFlow::ConfigSig {
  688.   predicate isSource(DataFlow::Node source) {
  689.     source = API::moduleImport("flask").getMember("request").asSource()
  690.   }
  691.  
  692.   predicate isSink(DataFlow::Node sink) {
  693.     exists(ExecuteCall ec |
  694.         sink = ec.getArg(0)
  695.        )
  696.   }
  697. }
  698.  
  699. module MyFlow = TaintTracking::Global&lt;MyConfig&gt;;
  700.  
  701. from MyFlow::PathNode source, MyFlow::PathNode sink
  702. where MyFlow::flowPath(source, sink)
  703. select sink.getNode(), source, sink, "execute sink called with untrusted data"
  704. </code></pre>
  705. <ul>
  706. <li>In the <code>isSource</code> predicate, we define our source to be an import of a Flask request. In a similar way as with the sink, we get the <code>flask</code> library and the references to the <code>request</code>. Then, with <code>asSource()</code>, we get the data flow node, where <code>flask.request</code> enters the database. Note that with <code>asSource()</code> we moved from the API graph to the data flow graph. </li>
  707. <li>In the <code>isSink</code> predicate, we define our sink to be the first argument to any <code>ExecuteCall</code> node with <code>exists(ExecuteCall ec | sink = ec.getArg(0))</code></li>
  708. </ul>
  709. <details>
  710. <summary><strong>Challenge 6&mdash;Run the taint tracking query to find flows from a Flask request to a django.db&rsquo;s <code>execute</code> sink</strong></summary>
  711. <p>Run the above query. If the path is not displaying properly, you may need to change the view to <code>alerts</code>.<br>
  712. <img loading="lazy" decoding="async" src="https://github.blog/wp-content/uploads/2024/04/codeql-query-alerts.png?w=452&#038;resize=452%2C332" alt='Change the view on your CodeQL query results to "alerts."' width="452" height="332" class="aligncenter size-large wp-image-77716 width-fit" srcset="https://github.blog/wp-content/uploads/2024/04/codeql-query-alerts.png?w=452&#038;resize=452%2C332 452w, https://github.blog/wp-content/uploads/2024/04/codeql-query-alerts.png?w=300 300w" sizes="(max-width: 452px) 100vw, 452px" data-recalc-dims="1" /><br>
  713. </p></details>
  714. <h3 id="old-taint-tracking-configuration" id="old-taint-tracking-configuration" >Old taint tracking configuration<a href="#old-taint-tracking-configuration" class="heading-link pl-2 text-italic text-bold" aria-label="Old taint tracking configuration"></a></h3>
  715. <p>We encourage you to use the new configuration, but for historical purposes we are including the old configuration here&mdash;there are many articles, conference talks, research papers about CodeQL, and some older CodeQL queries, which use the old configuration, and describing it shortly here should make it easier to understand how the older queries worked. The old configuration looks like this:</p>
  716. <pre><code>/*
  717. * @kind path-problem
  718. */
  719.  
  720. import python
  721. import semmle.python.dataflow.new.TaintTracking
  722.  
  723. class MyConfig extends TaintTracking::Configuration {
  724.  MyConfig() { this = "MyConfig" }
  725.  
  726.  override predicate isSource(DataFlow::Node source) {
  727.    ...
  728.  }
  729.  
  730.  override predicate isSink(DataFlow::Node sink) {
  731.    ...
  732.  }
  733. }
  734.  
  735. from MyConfig config, DataFlow::PathNode source, DataFlow::PathNode sink
  736. where
  737.    config.hasFlowPath(source, sink)
  738. select sink.getNode(), source, sink, "Sample Taint Tracking query"
  739. </code></pre>
  740. <p>In the old taint tracking configuration, we have to import the taint tracking module and then create a new myConfig class by extending it.</p>
  741. <p>If you&rsquo;d like to reuse a query you see in an article that uses the old taint tracking configuration, it should be possible in most cases. For others, I suggest translating the query from the old taint tracking configuration into the new one. See the changes and how to translate them <a href="https://github.blog/changelog/2023-08-14-new-dataflow-api-for-writing-custom-codeql-queries/">here</a>.</p>
  742. <p>There were also a few changes in how the partial path graph is used. If this is something you expect to use in your query or during audit, please consult the <a href="https://codeql.github.com/docs/writing-codeql-queries/debugging-data-flow-queries-using-partial-flow/#partial-flow">documentation</a> for how to use these. Other questions? Please ask in the <a href="https://gh.io/securitylabslack">GitHub Security Lab server on Slack</a>.</p>
  743. <h2 id="variant-analysis" id="variant-analysis" >Variant analysis<a href="#variant-analysis" class="heading-link pl-2 text-italic text-bold" aria-label="Variant analysis"></a></h2>
  744. <p>Probably one of the most interesting aspects of CodeQL is variant analysis.</p>
  745. <p>Variant analysis is a process, in which a known issue, for example, a specific vulnerability, is taken as a base for finding other variants&mdash;occurrences&mdash;of that vulnerability in source code.</p>
  746. <p>On a few occasions when I was auditing a specific codebase and found one vulnerability, variant analysis helped me find other variants of that vulnerability that I might otherwise have missed (or it would take me much longer to find them). Once, I happened to audit a codebase that had over twenty variants of the same vulnerability. Having CodeQL report on all the variants and their flow paths was invaluable, even just to keep track of the vulnerabilities I already triaged.</p>
  747. <p><img loading="lazy" decoding="async" src="https://github.blog/wp-content/uploads/2024/04/variant-analysis.png?w=500&#038;resize=500%2C500" alt='Cartoon-style drawing of several different types of bugs, including a ladybug, a spider, and ant, and two other ill-defined bugs labeled "also a bug?" The entire drawing is entitled "Variant analysis"' width="500" height="500" class="aligncenter size-large wp-image-77717 width-fit" srcset="https://github.blog/wp-content/uploads/2024/04/variant-analysis.png?w=500&#038;resize=500%2C500 500w, https://github.blog/wp-content/uploads/2024/04/variant-analysis.png?w=150 150w, https://github.blog/wp-content/uploads/2024/04/variant-analysis.png?w=300 300w, https://github.blog/wp-content/uploads/2024/04/variant-analysis.png?w=400 400w, https://github.blog/wp-content/uploads/2024/04/variant-analysis.png?w=200 200w, https://github.blog/wp-content/uploads/2024/04/variant-analysis.png?w=90 90w, https://github.blog/wp-content/uploads/2024/04/variant-analysis.png?w=116 116w" sizes="(max-width: 500px) 100vw, 500px" data-recalc-dims="1" /></p>
  748. <p>As an example,let&rsquo;s say we have an application with a SQL injection. The source of the vulnerability comes from a function displaying information about a user, called <code>show_user()</code>, which takes unsafe, user-supplied input from a Flask (popular Python web framework) GET request parameter and uses it in <code>cursor.execute()</code> from the <code>MySQLdb</code> library without sanitization.</p>
  749. <pre><code>def show_user():
  750.    username = request.args.get("username")
  751.    with connection.cursor() as cursor:
  752.        cursor.execute("SELECT * FROM users WHERE username = '%s'" % username)
  753. </code></pre>
  754. <p>Variant analysis could be used to detect that specific vulnerability, <strong>and</strong> if there are other <em>variants</em> of SQL injection in the codebase. It makes auditing applications much quicker.</p>
  755. <p>A variant of this vulnerability could be another Flask GET request parameter in our example application&mdash;for example, a function displaying a specific product, called <code>show_product()</code> whose input ends up in another <code>cursor.execute()</code> from <code>MySQLdb</code> library sink somewhere else in the application. In this case, our &ldquo;base&rdquo; vulnerability is SQL injection originating from any Flask GET request parameter to any <code>execute</code> <code>MySQLdb</code> library sink within the same codebase. Using QL, we can &ldquo;model&rdquo; in CodeQL the Flask GET request parameter as source, and <code>cursor.execute()</code> from <code>MySQLdb</code> as a sink and check for connection (flow) between the two.</p>
  756. <p>So, what we are looking for are vulnerable patterns. Once this base vulnerability is modeled, we can use it to query not only this example application, but we can use that &ldquo;vulnerable pattern&rdquo; to also query any other Python application. We will be doing it later in the blog post.</p>
  757. <p>All in all, running variant analysis allows us to quickly identify issues in huge modern code bases with little effort. On top of that, we can run variant analysis at scale by scanning hundreds of repositories for such vulnerable patterns at the same time. GitHub developed a tool for it, called multi-repository variant analysis (<a href="https://github.blog/2023-03-09-multi-repository-variant-analysis-a-powerful-new-way-to-perform-security-research-across-github/">MRVA</a>), which can run a query for a specific vulnerability in a thousand projects at once. We will expand on MRVA later in the blog because it will likely become an essential tool in your toolbox for finding vulnerabilities at scale.</p>
  758. <p>To sum up: CodeQL is able to discern the code that is a source in a given codebase, the code that is a sink, and check if there is a connection between the two. To do that, it uses models of such sources and sinks, and is able to detect the flow between them using data flow analysis and taint analysis.</p>
  759. <h2 id="source-and-sink-models-in-codeql" id="source-and-sink-models-in-codeql" >Source and sink models in CodeQL<a href="#source-and-sink-models-in-codeql" class="heading-link pl-2 text-italic text-bold" aria-label="Source and sink models in CodeQL"></a></h2>
  760. <p>CodeQL, as well as many other static analysis tools, mark certain code in certain libraries as a source or as a sink. In CodeQL, we call that process &ldquo;modeling&rdquo; sources and sinks. It&rsquo;s a common approach used by many static analysis tools and generally, the more models of frameworks and libraries the tool supports, the better.</p>
  761. <p>CodeQL has a very rich library and framework support&mdash;many libraries and frameworks are already modeled in CodeQL, with their sources and sinks. There are hundreds of sources and sinks, categorized for each vulnerability type. By using specialized queries for each vulnerability type, CodeQL checks for a data flow path between these predefined sources and sinks. In this way, CodeQL is able to detect the majority of existing vulnerabilities in a codebase, as long as said vulnerabilities can be detected using static analysis.</p>
  762. <h3 id="sources" id="sources" >Sources<a href="#sources" class="heading-link pl-2 text-italic text-bold" aria-label="Sources"></a></h3>
  763. <p>How can CodeQL tell what is a source and what is not? For CodeQL to be able to detect that a Flask HTTP request is a source, the Flask framework has to be modeled in CodeQL and certain function calls have to be defined in CodeQL as sources. This is done in <code>qll</code> files (as opposed to <code>ql</code> files, which are used for queries). For example, you can see the models for flask in the <a href="https://github.com/github/codeql/blob/main/python/ql/lib/semmle/python/frameworks/Flask.qll">CodeQL repository</a>. Specifically, <a href="https://github.com/github/codeql/blob/e8423f858f7bca6f9ac0b1eec8a3a2d5780e99d9/python/ql/lib/semmle/python/frameworks/Flask.qll#L89">the flask request is defined here</a>.</p>
  764. <pre><code>API::Node request() { result =
  765. API::moduleImport("flask").getMember("request") }
  766. </code></pre>
  767. <p>Since many vulnerabilities have common sources, but different sinks, there was introduced a type called <code>RemoteFlowSource</code> in CodeQL for Python, which contains all predefined sources.</p>
  768. <p>The Flask request that we introduced earlier is modeled as <a href="https://github.com/github/codeql/blob/e8423f858f7bca6f9ac0b1eec8a3a2d5780e99d9/python/ql/lib/semmle/python/frameworks/Flask.qll#L356-L360">a remote flow source here</a>.</p>
  769. <pre><code>private class FlaskRequestSource extends RemoteFlowSource::Range {
  770.  FlaskRequestSource() { this = request().asSource() }
  771.  
  772.  override string getSourceType() { result = "flask.request" }
  773. }
  774. </code></pre>
  775. <p>This is very interesting for us security researchers &#128161;, because we can query for all RemoteFlowSources in an application to get a quick overview of all places that user input enters an application. This can help us map the attack surface. We will use it later in the blog and in the challenges.</p>
  776. <h3 id="sinks" id="sinks" >Sinks<a href="#sinks" class="heading-link pl-2 text-italic text-bold" aria-label="Sinks"></a></h3>
  777. <p>When frameworks and libraries are modeled, certain code is categorized as certain types of sinks. In CodeQL for Python, we have a type for sinks for each vulnerability&mdash;there&rsquo;s a type for SQL injection sinks, for path injection, for deserialization, and others. The sinks, for example, <a href="https://github.com/github/codeql/blob/9e9be4fc5e7f4b4778594a4443c8528af0ea080d/python/ql/lib/semmle/python/Concepts.qll#L359-L362">SqlExecution</a>, are defined in the <a href="https://github.com/github/codeql/blob/main/python/ql/lib/semmle/python/Concepts.qll">Concepts</a> module.</p>
  778. <pre><code>class SqlExecution extends DataFlow::Node instanceof SqlExecution::Range {
  779.  /** Gets the argument that specifies the SQL statements to be executed. */
  780.  DataFlow::Node getSql() { result = super.getSql() }
  781. }
  782. </code></pre>
  783. <p>Most database libraries in Python follow the <a href="https://peps.python.org/pep-0249/">PEP249 Specification</a> (Python Database API Specification), so instead of modeling each database library separately, the CodeQL for Python team implemented a model for PEP249 which all database libraries implement in their models. For example, <a href="https://github.com/github/codeql/blob/9e9be4fc5e7f4b4778594a4443c8528af0ea080d/python/ql/lib/semmle/python/frameworks/MySQLdb.qll"><code>MySQLdb</code> library is modeled here</a>, by extending the PEP249 module.</p>
  784. <p>The <code>cursor.execute</code> method is modeled in <a href="https://github.com/github/codeql/blob/9e9be4fc5e7f4b4778594a4443c8528af0ea080d/python/ql/lib/semmle/python/frameworks/PEP249.qll#L70-L82">the PEP249 module here</a>. However, the case with having a PEP specification for several libraries is not that usual.</p>
  785. <pre><code>private class ExecuteMethodCall extends SqlExecution::Range, API::CallNode {
  786.  ExecuteMethodCall() {
  787.    exists(API::Node start |
  788.      start instanceof DatabaseCursor or start instanceof DatabaseConnection
  789.    |
  790.      this = start.getMember(getExecuteMethodName()).getACall()
  791.    )
  792.  }
  793.  
  794.  override DataFlow::Node getSql() {
  795.    result in [this.getArg(0), this.getArgByName(getSqlKwargName()),]
  796.  }
  797. }
  798. </code></pre>
  799. <p>As we can see, it extends  <code>SqlExecution</code>. Again, this can be interesting for us researchers. &#128161;</p>
  800. <h2 id="security-research-methodology-with-codeql-approaching-a-new-target" id="security-research-methodology-with-codeql-approaching-a-new-target" >Security research methodology with CodeQL&mdash;approaching a new target<a href="#security-research-methodology-with-codeql-approaching-a-new-target" class="heading-link pl-2 text-italic text-bold" aria-label="Security research methodology with CodeQL&mdash;approaching a new target"></a></h2>
  801. <p>Now that we learned about the building blocks of CodeQL, we can move on to doing our own research with CodeQL.</p>
  802. <p><img loading="lazy" decoding="async" src="https://github.blog/wp-content/uploads/2024/04/security-research-with-codeql.png?w=1024&#038;resize=1024%2C576" alt="Diagram outlining the different components of doing security research with CodeQL." width="1024" height="576" class="aligncenter size-large wp-image-77718 width-fit" srcset="https://github.blog/wp-content/uploads/2024/04/security-research-with-codeql.png?w=1600 1600w, https://github.blog/wp-content/uploads/2024/04/security-research-with-codeql.png?w=300 300w, https://github.blog/wp-content/uploads/2024/04/security-research-with-codeql.png?w=768 768w, https://github.blog/wp-content/uploads/2024/04/security-research-with-codeql.png?w=1024&#038;resize=1024%2C576 1024w, https://github.blog/wp-content/uploads/2024/04/security-research-with-codeql.png?w=1536 1536w" sizes="(max-width: 1000px) 100vw, 1000px" data-recalc-dims="1" /></p>
  803. <p>There&rsquo;s no &ldquo;one size fits all&rdquo; approach to code review methodology, but there are common actions that we usually do when approaching a new target during an audit. In this section, I want to look at general methodology used during security research and how to use CodeQL in each of its phases. Check out also the <a href="https://github.blog/2024-04-03-security-research-without-ever-leaving-github-from-code-scanning-to-cve-via-codespaces-and-private-vulnerability-reporting/">blog post</a> about doing research with GitHub tools written by my colleague, Jorge Rosillo. It&rsquo;s a case study which names tools and techniques that you can use for security research.</p>
  804. <p>In CodeQL zero to hero part 2, we mentioned that CodeQL can help us with manual audits by answering questions:</p>
  805. <ul>
  806. <li>What is my attack surface? Where should I start my audit?</li>
  807. <li>What are the sources (unsafe user-supplied input) in my code base?</li>
  808. <li>What are the sinks (dangerous functions)?</li>
  809. <li>Do the sources end up in any dangerous or untrusted functionality?</li>
  810. <li>Which parts of code are high in bug density and could be vulnerable?</li>
  811. </ul>
  812. <p>Let&rsquo;s have a look at how CodeQL can help us answer these questions.</p>
  813. <h3 id="quick-look-with-code-scanning" id="quick-look-with-code-scanning" >Quick look with code scanning<a href="#quick-look-with-code-scanning" class="heading-link pl-2 text-italic text-bold" aria-label="Quick look with code scanning"></a></h3>
  814. <p>The easiest way to get started with approaching a new target with CodeQL is to enable code scanning on it.</p>
  815. <p>Code scanning will run the security queries that are in the <a href="https://docs.github.com/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/built-in-codeql-query-suites#about-codeql-query-suites"><code>default</code></a> suite (in the default automated setup, that we used in challenge 1), that is most of the queries that are in the <code>&lt;language&gt;/ql/src/Security/</code> folder.</p>
  816. <p>If you prefer, you can enable the <a href="https://docs.github.com/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/built-in-codeql-query-suites#security-extended-query-suite"><code>security-extended</code></a> suite, which includes queries with lower precision and severity. This will give you an idea of what could be exploitable and any interesting points in the code that you could investigate further. If something has caught your attention, you could write queries to find other similar sources, sinks or patterns.</p>
  817. <p>If you&rsquo;d like even more inspiration, GitHub Security Lab has you covered&mdash; we decided to share some of our audit queries in <a href="https://github.com/GitHubSecurityLab/CodeQL-Community-Packs/">GitHubSecurityLab/CodeQL-Community-Packs</a>. Follow the instructions to enable them in your code scanning setup.</p>
  818. <p><img loading="lazy" decoding="async" src="https://github.blog/wp-content/uploads/2024/04/open-issues.png?w=1024&#038;resize=1024%2C611" alt="Screenshot of open issues resulting from the CodeQL query suite." width="1024" height="611" class="aligncenter size-large wp-image-77719 width-fit" srcset="https://github.blog/wp-content/uploads/2024/04/open-issues.png?w=1600 1600w, https://github.blog/wp-content/uploads/2024/04/open-issues.png?w=300 300w, https://github.blog/wp-content/uploads/2024/04/open-issues.png?w=768 768w, https://github.blog/wp-content/uploads/2024/04/open-issues.png?w=1024&#038;resize=1024%2C611 1024w, https://github.blog/wp-content/uploads/2024/04/open-issues.png?w=1536 1536w" sizes="(max-width: 1000px) 100vw, 1000px" data-recalc-dims="1" /></p>
  819. <h3 id="run-specific-queries-or-parts-of-queries" id="run-specific-queries-or-parts-of-queries" >Run specific queries or parts of queries<a href="#run-specific-queries-or-parts-of-queries" class="heading-link pl-2 text-italic text-bold" aria-label="Run specific queries or parts of queries"></a></h3>
  820. <p>After having an initial look at the target with code scanning, we can move on to reviewing the target for specific types of vulnerabilities with CodeQL in your <a href="https://github.com/GitHubSecurityLab/codeql-zero-to-hero/blob/main/2/challenge-2/instructions.md">local preferred CodeQL setup</a>.</p>
  821. <p>A good start is to run the queries in the <code>&lt;language&gt;/ql/src/Security/</code> folder separately as we did in the previous blog post. You could also edit the queries, if you are looking for something specific.</p>
  822. <p>You can also run several queries at once (or all of them) locally, by right clicking a folder with queries, for example, the Security folder, and then selecting &ldquo;Run queries in selected files.&rdquo;</p>
  823. <p><img loading="lazy" decoding="async" src="https://github.blog/wp-content/uploads/2024/04/run-queries_e4391c.png?w=751&#038;resize=751%2C1024" alt="" width="751" height="1024" class="aligncenter size-large wp-image-77734 width-fit" srcset="https://github.blog/wp-content/uploads/2024/04/run-queries_e4391c.png?w=902 902w, https://github.blog/wp-content/uploads/2024/04/run-queries_e4391c.png?w=220 220w, https://github.blog/wp-content/uploads/2024/04/run-queries_e4391c.png?w=768 768w, https://github.blog/wp-content/uploads/2024/04/run-queries_e4391c.png?w=751&#038;resize=751%2C1024 751w" sizes="(max-width: 751px) 100vw, 751px" data-recalc-dims="1" /></p>
  824. <details>
  825. <summary><strong>Challenge 7&mdash;Run all queries from the Security and experimental folders</strong></summary>
  826. <p>You will need to use the VS Code CodeQL Starter Workspace for this challenge. See <a href="https://github.com/GitHubSecurityLab/codeql-zero-to-hero/blob/main/2/challenge-2/instructions.md#option-b-local-installation">setup</a>. </p>
  827. <p>CodeQL for Python stores all its security related queries in <code>python/ql/src/Security/</code> folder and experimental queries in <code>python/ql/src/experimental/Security</code>. The folder structure might differ a bit for other languages, for example Ruby in <code>ruby/ql/src/queries/security</code> or  C# in <code>csharp/ql/src/Security Features</code>. </p>
  828. </details>
  829. <h3 id="find-all-sources-with-the-remoteflowsource-type" id="find-all-sources-with-the-remoteflowsource-type" >Find all sources with the RemoteFlowSource type<a href="#find-all-sources-with-the-remoteflowsource-type" class="heading-link pl-2 text-italic text-bold" aria-label="Find all sources with the RemoteFlowSource type"></a></h3>
  830. <p>In the previous section, we mentioned that all sources of untrusted data are modeled as <code>RemoteFlowSource</code> type. The source models can give us an overview of a codebase&rsquo;s attack surface and give starting points to research.</p>
  831. <p>We can use that type to query for all sources of untrusted data in a codebase and all entry points to an application. Using CodeQL for Python, we can query a CodeQL database like so:</p>
  832. <pre><code>/**
  833. * @kind problem
  834. * @problem.severity error
  835. * @id githubsecuritylab/3-8
  836. */
  837. import python
  838. import semmle.python.dataflow.new.RemoteFlowSources
  839.  
  840. from RemoteFlowSource rfs
  841. select rfs, "A remote flow source"
  842. </code></pre>
  843. <p>Getting all the possible sources is an easy way to start an audit of an application. Remember that if you want to limit what files are scanned for sources, you can use the built-in predicates such as <code>getLocation</code>, as we did in the previous blog.</p>
  844. <details>
  845. <summary><strong>Challenge 8&mdash;Query for remote flow sources</strong></summary>
  846. <p>Find all the sources in the provided database using the <code>RemoteFlowSource</code> type.</p>
  847. <p>Feel free to choose a different project to query on; maybe you&rsquo;ll find something interesting? To download a CodeQL database for any open source project on GitHub, check <a href="https://github.com/GitHubSecurityLab/codeql-zero-to-hero/blob/main/2/challenge-2/instructions.md#select-codeql-database"> setup instructions</a>.</p>
  848. </details>
  849. <h3 id="find-all-sinks-for-a-specific-vulnerability-type" id="find-all-sinks-for-a-specific-vulnerability-type" >Find all sinks for a specific vulnerability type<a href="#find-all-sinks-for-a-specific-vulnerability-type" class="heading-link pl-2 text-italic text-bold" aria-label="Find all sinks for a specific vulnerability type"></a></h3>
  850. <p>In a similar way as with sources, we could query for all SQL injection sinks within a codebase. It&rsquo;s especially useful if it happens that an application uses more than one database library. We could do it by using the <code>Quick evaluation</code> functionality introduced earlier. Go to the <code>SqlInjection.ql</code> query located in <code>python/ql/src/Security/CWE-089/SqlInjection.ql</code> and move your mouse cursor over the module <code>SqlInjectionQuery</code> in the second import statement.</p>
  851. <p><img loading="lazy" decoding="async" src="https://github.blog/wp-content/uploads/2024/04/sql-injection-query.png?w=848&#038;resize=848%2C219" alt="Screenshot of an SQL injection query" width="848" height="219" class="aligncenter size-large wp-image-77721 width-fit" srcset="https://github.blog/wp-content/uploads/2024/04/sql-injection-query.png?w=848&#038;resize=848%2C219 848w, https://github.blog/wp-content/uploads/2024/04/sql-injection-query.png?w=300 300w, https://github.blog/wp-content/uploads/2024/04/sql-injection-query.png?w=768 768w" sizes="(max-width: 848px) 100vw, 848px" data-recalc-dims="1" /></p>
  852. <p>This module is where most of the logic for the query is defined. Right click on the <code>SqlInjectionQuery</code> and choose the &ldquo;Go to definition&rdquo; option. This will move you to the file with the module.</p>
  853. <p>Let&rsquo;s say we are interested in all SQL injection sinks. These are all included by the <code>isSink</code> predicate. If you look just above the <code>isSink</code>predicate over line 22, you will see the &ldquo;Quick evaluation: isSink&rdquo; option. Click it and you should see all the SQL injection sinks in a given database. Alternatively, you can right click and then choose &ldquo;CodeQL: Quick evaluation&rdquo;. If you are having issues with running the query, make sure that you have a Python CodeQL database selected (see <a href="https://github.com/GitHubSecurityLab/codeql-zero-to-hero/blob/main/2/challenge-2/instructions.md">setup</a>).</p>
  854. <p><img loading="lazy" decoding="async" src="https://github.blog/wp-content/uploads/2024/04/configuration.png?w=643&#038;resize=643%2C141" alt="Screenshot of the configuration for a SQL injection query" width="643" height="141" class="aligncenter size-large wp-image-77722 width-fit" srcset="https://github.blog/wp-content/uploads/2024/04/configuration.png?w=643&#038;resize=643%2C141 643w, https://github.blog/wp-content/uploads/2024/04/configuration.png?w=300 300w" sizes="(max-width: 643px) 100vw, 643px" data-recalc-dims="1" /></p>
  855. <p>This way of querying for sinks is faster, but not as flexible. We cannot really edit the queries, unless we wanted to edit the <code>SqlInjectionQuery</code> module.</p>
  856. <p>Another way we could get all the sinks is by querying for the <code>SqlExecution</code> type in the codebase. We could query for all SQL injection sinks like below.</p>
  857. <pre><code>/**
  858. * @kind problem
  859. * @problem.severity error
  860. * @id githubsecuritylab/3-9
  861. */
  862.  
  863. import python
  864. import semmle.python.Concepts
  865.  
  866. from SqlExecution sink
  867. select sink, "Potential SQL injection sink"
  868. </code></pre>
  869. <p>Many of the sinks we use in CodeQL for Python, including <a href="https://github.com/github/codeql/blob/9e9be4fc5e7f4b4778594a4443c8528af0ea080d/python/ql/lib/semmle/python/Concepts.qll#L359-L362">SqlExecution</a>, are defined in the <a href="https://github.com/github/codeql/blob/main/python/ql/lib/semmle/python/Concepts.qll">Concepts</a> module, for example, <code>CodeExecution</code>, <code>XPathConstruction,</code> and more. The advantage of using this method is that it is done in a separate file and this way you could add any conditions to the query, if you want to.</p>
  870. <details>
  871. <summary><strong>Challenge 9&mdash;Query for SQL injection sinks</strong></summary>
  872. <p>Find all the SQL injection sinks. See what other sinks are available in Concepts and try to query for them.</p>
  873. <p>Feel free to choose a different project to query on.</p>
  874. </details>
  875. <p>Some of the queries do not use the <code>Concepts</code> module, for example, the cleartext logging query, defined in <a href="https://github.com/github/codeql/blob/main/python/ql/src/Security/CWE-312/CleartextLogging.ql">CleartextLogging.ql</a>. In that case, you would have to look into the implementation of the query in the qll files: <a href="https://github.com/github/codeql/blob/main/python/ql/lib/semmle/python/security/dataflow/CleartextLoggingQuery.qll">CleartextLoggingQuery.qll</a> and <a href="https://github.com/github/codeql/blob/main/python/ql/lib/semmle/python/security/dataflow/CleartextLoggingCustomizations.qll">CleartextLoggingCustomizations.qll</a>. In <a href="https://github.com/github/codeql/blob/main/python/ql/lib/semmle/python/security/dataflow/CleartextLoggingCustomizations.qll">CleartextLoggingCustomizations.qll</a>, we can see several kinds of sinks: first, there is LoggingAsSink sink, which uses the <code>Logging</code> sinks that are defined in the Concepts module, but there is also another sink class defined&mdash;<code>PrintedDataAsSink</code>. See below for a shortened version of the code from the link.</p>
  876. <pre><code>/** A piece of data logged, considered as a flow sink. */
  877.  class LoggingAsSink extends Sink {
  878.    LoggingAsSink() { this = any(Logging write).getAnInput() }
  879.  }
  880.  
  881.  /** A piece of data printed, considered as a flow sink. */
  882.  class PrintedDataAsSink extends Sink {
  883.    PrintedDataAsSink() {
  884.      (
  885.        this = API::builtin("print").getACall().getArg(_)
  886.        or
  887.        this =
  888.          API::moduleImport("sys")
  889.              .getMember(["stdout", "stderr"])
  890.              .getMember("write")
  891.              .getACall()
  892.              .getArg(0)
  893.      ) and
  894.      not exists(Module loggingInit |
  895.        loggingInit.getName() = "logging.__init__" and
  896.        this.getScope().getEnclosingModule() = loggingInit and
  897.        not exists(loggingInit.getFile().getRelativePath())
  898.      )
  899.    }
  900.  }
  901. }
  902. </code></pre>
  903. <p>Note that there are very few sinks implemented this way for Python&mdash;most sinks are in <code>Concepts.qll</code>. The sinks implement the Range design pattern, which allows for both easy extension and refinement of classes.</p>
  904. <p>Many languages use the Concepts module, for example, Go&rsquo;s <code>Concepts</code> is defined <a href="https://github.com/github/codeql/blob/main/go/ql/lib/semmle/go/Concepts.qll">here</a>. Note though, that even though a language uses Concepts, you may still need to look into the implementation of a particular path query to find their sinks, just like in the case with CleartextLogging query.</p>
  905. <h3 id="find-calls-to-all-external-apis-untrusted-functionality" id="find-calls-to-all-external-apis-untrusted-functionality" >Find calls to all external APIs (untrusted functionality)<a href="#find-calls-to-all-external-apis-untrusted-functionality" class="heading-link pl-2 text-italic text-bold" aria-label="Find calls to all external APIs (untrusted functionality)"></a></h3>
  906. <p>&ldquo;<a href="https://github.com/github/codeql/blob/main/python/ql/src/Security/CWE-020-ExternalAPIs/UntrustedDataToExternalAPI.ql">CWE-20 Untrusted APIs</a>&rdquo; query is a special query that is very interesting for security researchers. It detects if data from untrusted sources is used by any external APIs. By &ldquo;external APIs&rdquo; we understand anything that is outside of a codebase&mdash;calls to methods from libraries and others. Any code that is not defined in our codebase is considered untrusted and could be interesting from a security researcher&rsquo;s point of view. In that way, this query covers sinks from many vulnerability categories at once. It is also very useful to identify third- party APIs that may require modeling if we want the taint tracking analyzer to continue the analysis after it.</p>
  907. <p><a href="https://twitter.com/frycos">@frycos</a> presented how he found a pre-authentication remote code execution in 20 minutes using this query in this <a href="https://frycos.github.io/vulns4free/2022/12/02/rce-in-20-minutes.html">article</a>.</p>
  908. <details>
  909. <summary><strong>Challenge 10&mdash;Run CWE-20 Untrusted APIs query</strong></summary>
  910. <p>Run the CWE-20 Untrusted APIs query on a repo of your choice. For Python in the VS Code CodeQL Starter Workspace, it is located in <code>vscode-codeql-starter/ql/python/ql/src/Security/CWE-020-ExternalAPIs/UntrustedDataToExternalAPI.ql</code>.</p>
  911. <p>Try to choose a new project, download its database from GitHub (see setup) and run this query on it.</p>
  912. </details>
  913. <h3 id="next-steps" id="next-steps" >Next steps<a href="#next-steps" class="heading-link pl-2 text-italic text-bold" aria-label="Next steps"></a></h3>
  914. <p>After you have identified any interesting areas, the next step would be to verify them. If you suspect that the vulnerability you&rsquo;ve found could be a candidate for variant analysis, you might want to use QL to model it and see if there are other variants of the vulnerability in that codebase or other codebases.</p>
  915. <p>Sometimes it might be hard to decide whether to model a vulnerability using CodeQL, or not. Generally, I advise you to have a look at security research using CodeQL that was published by the security community. More on that in the &ldquo;Community research with CodeQL&rdquo; section.</p>
  916. <h2 id="multi-repository-variant-analysis-mrva" id="multi-repository-variant-analysis-mrva" >Multi-repository variant analysis (MRVA)<a href="#multi-repository-variant-analysis-mrva" class="heading-link pl-2 text-italic text-bold" aria-label="Multi-repository variant analysis (MRVA)"></a></h2>
  917. <p>We mentioned the tool <a href="https://codeql.github.com/docs/codeql-for-visual-studio-code/running-codeql-queries-at-scale-with-mrva/">MRVA</a> in the &ldquo;variant analysis&rdquo; section. <a href="https://github.blog/2023-03-09-multi-repository-variant-analysis-a-powerful-new-way-to-perform-security-research-across-github/">MRVA</a> is a tool which can run a given CodeQL query against a thousand projects at once. You can run any CodeQL query using MRVA, be it prewritten or your own. As you can see, it&rsquo;s a very powerful tool for doing security research at scale. For example, you could run the prewritten SQL injection query against the top 1,000 Python projects or any other security query and then choose the top 1,000 projects for that language.</p>
  918. <p>Say you have created a new query to find variants of a certain vulnerability&mdash;it could be Log4Shell, for example. If the vulnerability you modeled is novel, by using MRVA, you may be able to detect tens of vulnerabilities across hundreds of open source projects all within a few clicks. Thanks to these features, using CodeQL together with MRVA has become popular with security researchers.</p>
  919. <p><img loading="lazy" decoding="async" src="https://github.blog/wp-content/uploads/2024/04/queryql.png?w=956&#038;resize=956%2C633" alt="Screenshot of the query.ql Variant Analysis Results" width="956" height="633" class="aligncenter size-large wp-image-77723 width-fit" srcset="https://github.blog/wp-content/uploads/2024/04/queryql.png?w=956&#038;resize=956%2C633 956w, https://github.blog/wp-content/uploads/2024/04/queryql.png?w=300 300w, https://github.blog/wp-content/uploads/2024/04/queryql.png?w=768 768w" sizes="(max-width: 956px) 100vw, 956px" data-recalc-dims="1" /></p>
  920. <p>Let&rsquo;s try to run MRVA with an existing query.</p>
  921. <details>
  922. <summary><strong>Challenge 11&mdash;Run MRVA using one of the security queries</strong></summary>
  923. <p>Set up MRVA using instructions <a href="https://codeql.github.com/docs/codeql-for-visual-studio-code/running-codeql-queries-at-scale-with-mrva/#controller-repository">here</a>. Select top 10 repositories in the CodeQL extension tab. Choose one of the prewritten queries in your favorite language, right-click in the query file, and select CodeQL: Run Variant Analysis to start variant analysis. If you don&rsquo;t find anything using that query, it&rsquo;s likely because the project is already secured against that vulnerability. If you prefer, run one of the bigger lists with 100 or 1,000 repositories. </p>
  924. <p><em>Note: if you do find true positive vulnerabilities, make sure to verify them first and then report them using the coordinated disclosure process. See our <a href="https://github.blog/2022-02-09-coordinated-vulnerability-disclosure-cvd-open-source-projects/">guide</a> for reporting vulnerabilities to open source.</em></p>
  925. </details>
  926. <p>MRVA comes with predefined lists of top 10, top 100 and top 1,000 projects available on GitHub for any language, but you can also add your own list of projects. MRVA allows you to create your own list of projects using GitHub&rsquo;s code search functionality. See how to use it <a href="https://codeql.github.com/docs/codeql-for-visual-studio-code/running-codeql-queries-at-scale-with-mrva/#using-github-code-search-to-add-repositories-to-a-custom-list">here</a>.</p>
  927. <h2 id="community-research-with-codeql" id="community-research-with-codeql" >Community research with CodeQL<a href="#community-research-with-codeql" class="heading-link pl-2 text-italic text-bold" aria-label="Community research with CodeQL"></a></h2>
  928. <p>There has been a lot of great security research published with CodeQL and I&rsquo;d like to highlight some of it in this section. I hope it inspires you in your own research.</p>
  929. <div class="content-table-wrap"><table style="border: 1px black">
  930. <tbody>
  931. <tr>
  932. <td>Note: Many resources mention the LGTM platform, which was <a href="https://github.blog/2022-08-15-the-next-step-for-lgtm-com-github-code-scanning/">deprecated</a> in 2022 after the launch of code scanning. You can use the VS Code Starter Workspace setup to run the same queries as in the articles, or use MRVA to run the query against multiple projects at once.</td>
  933. </tr>
  934. </tbody>
  935. </table></div>
  936. <h4 id="python" id="python" >Python<a href="#python" class="heading-link pl-2 text-italic text-bold" aria-label="Python"></a></h4>
  937. <ul>
  938. <li><a href="https://frycos.github.io/vulns4free/2022/12/02/rce-in-20-minutes.html">Pre-Auth RCE with CodeQL in Under 20 Minutes</a><br>
  939. Writeup by <a href="https://twitter.com/frycos">@frycos</a> in which they describe how they found a pre-authentication remote code execution in 20 minutes in pgAdmin using the CWE-20 Untrusted API query.</li>
  940. <li><a href="https://jorgectf.github.io/blog/post/practical-codeql-introduction/">Practical Introduction to CodeQL</a><br>
  941. Practical writeup of how <a href="https://twitter.com/jorge_ctf">@jorgectf</a> wrote new QL queries for detecting XXE, LDAP injection, and regular expression injection, which were later rewarded in the CodeQL bug bounty program and merged into the CodeQL repository upstream.</li>
  942. </ul>
  943. <h4 id="java" id="java" >Java<a href="#java" class="heading-link pl-2 text-italic text-bold" aria-label="Java"></a></h4>
  944. <ul>
  945. <li><a href="https://securitylab.github.com/research/apache-dubbo/">Apache Dubbo: All roads lead to RCE</a><br>
  946. A deep dive into auditing Apache Dubbo with CodeQL by <a href="https://twitter.com/pwntester">@pwntester</a>. It includes analyzing Dubbo architecture, identifying sources, and modeling the ones that weren&rsquo;t reported by CodeQL. Thirteen new deserialization vulnerabilities were reported as a result of the research.  <a href="https://twitter.com/pwntester">@pwntester</a> also created a CodeQL workshop with a step by step guide to write the queries that he wrote for auditing Dubbo. See the v<a href="https://www.youtube.com/watch?v=-bJ2Ioi7Icg">ideo</a> and accompanying <a href="https://github.com/github/codeql-dubbo-workshop/tree/master">repository</a>.</li>
  947. <li><a href="https://mogwailabs.de/en/blog/2021/09/vulnerability-digging-with-codeql/">Vulnerability digging with CodeQL</a><br>
  948. Writeup about modeling a Java deserialization vulnerability in CodeQL by <a href="https://twitter.com/mtimo44">@mtimo44</a> and <a href="https://twitter.com/h0ng10">@h0ng10</a>.</li>
  949. </ul>
  950. <h4 id="c-c" id="c-c" >C/C++<a href="#c-c" class="heading-link pl-2 text-italic text-bold" aria-label="C/C++"></a></h4>
  951. <ul>
  952. <li><a href="https://securitylab.github.com/research/bug-hunting-codeql-rsyslog/">Bug Hunting with CodeQL in Rsyslog</a><br>
  953. Beginner-friendly step by step process of finding vulnerabilities using CodeQL in Rsyslog by <a href="https://twitter.com/agustingianni">@agustingianni</a>.</li>
  954. <li><a href="https://medium.com/csg-govtech/hunting-bugs-in-accel-ppp-with-codeql-8370e297e18f">Hunting bugs in Accel-PPP with CodeQL</a> by Chloe Ong and <a href="https://medium.com/csg-govtech/removing-false-positives-in-codeql-2b9f9f02cd99">Removing False Positives in CodeQL</a> by Kar Wei Loh.<br>
  955. The two researchers worked together to find memory corruption bugs in Accel-PPP. The first article is an in-depth writeup about looking for the bugs and the thought process, writing CodeQL and the challenges they&rsquo;ve encountered. The second article shows how they refined the CodeQL query to provide more precise results.</li>
  956. <li><a href="https://github.com/google/security-research/blob/master/pocs/cpus/spectre-gadgets/README.md">Finding Gadgets for CPU Side-Channels with Static Analysis Tools</a><br>
  957. Research by <a href="https://twitter.com/pwningsystems">@pwningsystems</a> and <a href="https://twitter.com/fkaasan">@fkaasan</a> into finding useful gadgets in CPU side-channel exploitation.</li>
  958. </ul>
  959. <h2 id="reach-out" id="reach-out" >Reach out!<a href="#reach-out" class="heading-link pl-2 text-italic text-bold" aria-label="Reach out!"></a></h2>
  960. <p>If CodeQL and this post helped you to find a vulnerability, we would love to hear about it! Reach out to us on <a href="https://gh.io/securitylabslack">GitHub Security Lab on Slack</a> or tag us <a href="https://twitter.com/GHSecurityLab">@ghsecuritylab</a> on X.</p>
  961. <p>If you have any questions, issues with challenges or with writing a CodeQL query, feel free to join and ask on the <a href="https://gh.io/securitylabslack">GitHub Security Lab server on Slack</a>. The Slack server is open to anyone and gives you access to ask questions about issues with CodeQL, CodeQL modeling or anything else CodeQL related, and receive answers from a number of CodeQL engineers and security researchers from GitHub Security Lab (me included!). If you prefer to stay off Slack, feel free to ask any questions in <a href="https://github.com/github/codeql/discussions">CodeQL repository discussions</a> or in <a href="https://github.com/github/securitylab/discussions">GitHub Security Lab repository discussions</a>.</p>
  962. </body></html>
  963. <p>The post <a href="https://github.blog/2024-04-29-codeql-zero-to-hero-part-3-security-research-with-codeql/">CodeQL zero to hero part 3: Security research with CodeQL</a> appeared first on <a href="https://github.blog">The GitHub Blog</a>.</p>
  964. ]]></content:encoded>
  965. <post-id xmlns="com-wordpress:feed-additions:1">77703</post-id> </item>
  966. <item>
  967. <title>GitHub Actions, Arm64, and the future of automotive software development</title>
  968. <link>https://github.blog/2024-04-26-github-actions-arm64-and-the-future-of-automotive-software-development/</link>
  969. <dc:creator><![CDATA[Clay Nelson]]></dc:creator>
  970. <pubDate>Fri, 26 Apr 2024 15:33:43 +0000</pubDate>
  971. <category><![CDATA[Enterprise]]></category>
  972. <category><![CDATA[GitHub Actions]]></category>
  973. <category><![CDATA[GitHub Enterprise]]></category>
  974. <category><![CDATA[GitHub-hosted runners]]></category>
  975. <guid isPermaLink="false">https://github.blog/?p=77619</guid>
  976.  
  977. <description><![CDATA[<p>Learn how GitHub's Enterprise Cloud, GitHub Actions, and Arm's latest Automotive Enhanced processors, work together to usher in a new era of efficient, scalable, and flexible automotive software creation.</p>
  978. <p>The post <a href="https://github.blog/2024-04-26-github-actions-arm64-and-the-future-of-automotive-software-development/">GitHub Actions, Arm64, and the future of automotive software development</a> appeared first on <a href="https://github.blog">The GitHub Blog</a>.</p>
  979. ]]></description>
  980. <content:encoded><![CDATA[<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
  981. <html><body><h2 id="automotive-software-development-moves-to-the-cloud" id="automotive-software-development-moves-to-the-cloud" >Automotive software development moves to the cloud<a href="#automotive-software-development-moves-to-the-cloud" class="heading-link pl-2 text-italic text-bold" aria-label="Automotive software development moves to the cloud"></a></h2>
  982. <p>We are at an inflection point for automotive embedded development to move to the cloud. In an era where software has not just eaten the world but is continuously redefining it through AI, the cloud emerges not just as a platform but as the foundational fabric for software engineering. With AI&rsquo;s increasing demand for computational power driving unprecedented changes in silicon, both at the edge and in the cloud, the need for agile, scalable, and continuously optimized development environments has never been more critical. As the home of the world&rsquo;s developers, GitHub is the platform to build the next generation of automotive and embedded development environments in the cloud.</p>
  983. <h3 id="traditional-embedded-development-challenges" id="traditional-embedded-development-challenges" >Traditional embedded development challenges<a href="#traditional-embedded-development-challenges" class="heading-link pl-2 text-italic text-bold" aria-label="Traditional embedded development challenges"></a></h3>
  984. <p>Improving the developer experience is at the heart of what GitHub does. We&rsquo;re dedicated to making coding as smooth as possible by reducing unnecessary complexity. The traditional process for developers working with embedded systems has plenty of friction to remove. Historically, software development has been very hardware-dependent with developers maintaining some combination of test hardware connected to their development machines or an in-house testing farm. There weren&rsquo;t many alternatives because so much was proprietary.</p>
  985. <p>In recent years, a series of technical advancements have significantly influenced the foundational architectures within the field. Despite these changes, many traditional methods and operational processes remain in use. Key developments include the adoption of more powerful multipurpose processors, the establishment of open standards for the lower-level software stack such as <a href="http://SOAFEE.io">SOAFEE.io</a> for cloud native architecture at the edge, and the increased reliance on open-source resources, facilitating reuse across different domains. These innovations have provided developers with the opportunity to fundamentally rethink their approaches to development, enabling more efficient and flexible strategies.</p>
  986. <p>As the rate of these technical trends and foundational change increases, teams are finding it increasingly difficult to deliver application commitments without significant cost of maintaining these in-house development and test environments.</p>
  987. <div class="post-content-cta"><p>See how <a href="https://www.soafee.io/about/charter">Scalable Open Architecture For Embedded Edge (SOAFEE)</a>, an industry-led collaboration between companies across the automotive and technology sectors, is working to radically simplify vehicle software solutions.</p>
  988. </div>
  989. <h2 id="virtualization-for-embedded-and-automotive-development" id="virtualization-for-embedded-and-automotive-development" >Virtualization for embedded and automotive development<a href="#virtualization-for-embedded-and-automotive-development" class="heading-link pl-2 text-italic text-bold" aria-label="Virtualization for embedded and automotive development"></a></h2>
  990. <p>While virtualization has become a cornerstone of enterprise development, its integration into embedded systems has proceeded at a more cautious pace. The complexities inherent in embedded systems&mdash;spanning a vast array of processors, operating systems, and specialized software&mdash;pose unique challenges not encountered in the more homogeneous environments of data centers and IT networks. Embedded systems require a nuanced approach to virtualization that goes beyond simply accommodating mainstream operating systems like Windows and Linux on standard Intel architectures.</p>
  991. <p>In a significant development that reflects the evolving landscape of embedded systems, in March 2024, <a href="https://newsroom.arm.com/blog/automotive-enhanced-ip-portfolio">Arm unveiled its new Automotive Enhanced (AE) processors</a>. These cutting-edge processors are designed to boost AI capabilities within the automotive sector, ensuring <a href="https://newsroom.arm.com/blog/isa-parity">ISA (Instruction Set Architecture) compatibility</a>. This advancement is poised to revolutionize the way applications are developed and deployed, enabling developers to create software in the cloud and seamlessly transition it to the edge, such as in vehicles, without the need for extensive reconfiguration or modification. This leap forward promises to accelerate the time-to-market for new applications, bridging the gap between cloud development environments and the nuanced world of embedded systems .</p>
  992. <p>This transition exemplifies how advancements in processor technology and virtualization are converging to address the unique challenges of embedded development, paving the way for more integrated and efficient systems across industries. Developers will be able to write, build, and test code in the cloud and then run their applications in virtualized environments with digital twins that mirror their processor targets, even if those targets haven&rsquo;t even been delivered in the silicon.</p>
  993. <h2 id="cloud-based-continuous-integration-platform" id="cloud-based-continuous-integration-platform" >Cloud-based continuous integration platform<a href="#cloud-based-continuous-integration-platform" class="heading-link pl-2 text-italic text-bold" aria-label="Cloud-based continuous integration platform"></a></h2>
  994. <p>Continuous integration (CI), a cornerstone of agile methodologies for over two decades, automates the build, test, and deployment processes. This automation accelerates feedback loops, enabling timely verification that the software meets the intended requirements. It also minimizes integration risks and enhances the early detection of defects and security vulnerabilities. While surveys indicate that many embedded development teams have adopted CI as a practice, managing the development environments across multiple hardware configurations and deployment targets is costly and complex.</p>
  995. <p>Implementing CI/CD in a cloud environment leverages the well-established advantages of cloud computing for embedded engineering teams, significantly enhancing their ability to deliver high-quality products within tight market timelines.</p>
  996. <ul>
  997. <li><strong>Enhanced Scalability.</strong> Cloud-based CI allows teams to dynamically allocate resources and optimize compute spend. Teams can execute workloads in parallel in order to support multiple hardware and software configurations simultaneously. Developers can also participate across geographic regions or even across organizational boundaries within the supply chain.</li>
  998. <li><strong>Reduced Complexity.</strong> Standardizing on cloud-based CI reduces environment setup and tear down times and promotes consistency. Workflows can easily be shared across teams. </li>
  999. <li><strong>Improved Quality.</strong> When compute resources are too constrained or managing the CI environment is brittle, teams may optimize locally onto too narrow a piece of the development. Reducing this friction and thereby increasing the end to end feedback loops can improve quality. </li>
  1000. </ul>
  1001. <p>To deliver cloud-based embedded developer environments for the design and build time that feed into the runtime virtualized and simulated targets, GitHub needed to update our infrastructure. In October 2023, GitHub <a href="https://github.blog/changelog/2023-10-30-accelerate-your-ci-cd-with-arm-based-hosted-runners-in-github-actions/">announced native Arm64 support for our hosted CI/CD workflow engine, GitHub Actions</a>. Supporting this platform is important because Arm&rsquo;s family of processor designs are central to many uses in the embedded and automotive world.</p>
  1002. <p>This promises to free embedded developers from being tied to the desktop. By moving jobs to the cloud, development teams will be able to focus more on coding time and less on infrastructure management. We also recently <a href="https://github.blog/2024-04-02-bringing-enterprise-level-security-and-even-more-power-to-github-hosted-runners/">announced the public beta of GPU hosted runners</a> that will enable teams building machine learning models to do complete application testing, including the ML components within GitHub Actions.</p>
  1003. <h2 id="conclusion" id="conclusion" >Conclusion<a href="#conclusion" class="heading-link pl-2 text-italic text-bold" aria-label="Conclusion"></a></h2>
  1004. <p>The convergence of cloud technologies, advanced virtualization, and cutting-edge processor innovations represents a transformative shift in automotive software development. To further advance and support these transformations across the industry, GitHub has recently joined SOAFEE.io, as well as maintaining our membership in the Connected Vehicle Systems Alliance (COVESA) and supporting Microsoft&rsquo;s commitment to the Eclipse Software Defined Vehicle project.</p>
  1005. <p>GitHub Enterprise Cloud, along with Arm&rsquo;s latest AE processors, heralds a new era where development and testing transcend traditional boundaries, leveraging the cloud&rsquo;s vast resources for more efficient, scalable, and flexible software creation. This paradigm shift towards cloud-based development and virtualized testing environments not only addresses the complexities and limitations of embedded system design but also dramatically reduces the overhead associated with physical hardware dependencies. By enabling developers to seamlessly transition applications from the cloud to the edge without extensive rework, the automotive industry stands on the brink of a significant acceleration in innovation and time-to-market for new technologies.</p>
  1006. <p>GitHub&rsquo;s introduction of native Arm64 support and the public beta of GPU hosted runners on its CI/CD platform, GitHub Actions, further underscores this transition. These advancements ensure that the embedded and automotive development communities can fully harness the cloud&rsquo;s potential, facilitating a shift from local, hardware-constrained development processes to a more agile, cloud-centric approach. As a result, developers can focus more on innovation and less on the intricacies of hardware management, propelling the automotive sector into a future where software development is more integrated, dynamic, and responsive to the rapidly evolving demands of technology and consumers. This transition not only signifies a leap forward in how automotive software is developed but also reflects a broader trend towards the cloud as the backbone of modern software engineering across industries.</p>
  1007. <div class="post-content-cta"><p><a href="https://docs.github.com/en/actions/using-github-hosted-runners">Learn more about GitHub-hosted runners</a> and look for the public beta for Arm-hosted runners coming later this year.</p>
  1008. </div>
  1009. </body></html>
  1010. <p>The post <a href="https://github.blog/2024-04-26-github-actions-arm64-and-the-future-of-automotive-software-development/">GitHub Actions, Arm64, and the future of automotive software development</a> appeared first on <a href="https://github.blog">The GitHub Blog</a>.</p>
  1011. ]]></content:encoded>
  1012. <post-id xmlns="com-wordpress:feed-additions:1">77619</post-id> </item>
  1013. <item>
  1014. <title>Securing millions of developers through 2FA</title>
  1015. <link>https://github.blog/2024-04-24-securing-millions-of-developers-through-2fa/</link>
  1016. <dc:creator><![CDATA[Mike Hanley]]></dc:creator>
  1017. <pubDate>Wed, 24 Apr 2024 15:00:53 +0000</pubDate>
  1018. <category><![CDATA[Security]]></category>
  1019. <category><![CDATA[2FA]]></category>
  1020. <category><![CDATA[GitHub.com]]></category>
  1021. <category><![CDATA[supply chain security]]></category>
  1022. <guid isPermaLink="false">https://github.blog/?p=77576</guid>
  1023.  
  1024. <description><![CDATA[<p>We’ve dramatically increased 2FA adoption on GitHub as part of our responsibility to make the software ecosystem more secure. Read on to learn how we secured millions of developers and why we’re urging more organizations to join us in these efforts.</p>
  1025. <p>The post <a href="https://github.blog/2024-04-24-securing-millions-of-developers-through-2fa/">Securing millions of developers through 2FA</a> appeared first on <a href="https://github.blog">The GitHub Blog</a>.</p>
  1026. ]]></description>
  1027. <content:encoded><![CDATA[<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
  1028. <html><body><p>Though technology has advanced significantly to combat the proliferation of sophisticated security threats, the reality is that <strong>preventing the next cyberattack depends on getting the security basics right, and efforts to secure the software ecosystem must protect the developers who design, build, and maintain the software we all depend on</strong>.</p>
  1029. <p>As the home to the world&rsquo;s largest developer community, GitHub is in a unique position to help improve the security of the software supply chain. In May 2022, we <a href="https://github.blog/2022-05-04-software-security-starts-with-the-developer-securing-developer-accounts-with-2fa/">introduced</a> an initiative to raise the bar for supply chain security by addressing the first link in that chain&mdash;the security of developers. Because strong multi-factor authentication remains one of the best defenses against account takeover and subsequent supply chain compromise, we set an ambitious goal to require users who contribute code on GitHub.com to enable one or more forms of two-factor authentication (2FA) by the end of 2023.</p>
  1030. <p>What followed was a year&rsquo;s worth of investments in research and design around the <a href="https://github.blog/2022-12-14-raising-the-bar-for-software-security-next-steps-for-github-com-2fa/">implementation</a> of these requirements, to optimize for a seamless experience for developers, followed by a <a href="https://github.blog/2023-03-09-raising-the-bar-for-software-security-github-2fa-begins-march-13/">gradual rollout</a> to ensure successful user onboarding as we continued to scale our requirements. While our efforts to ensure developers can be as secure as possible on GitHub.com don&rsquo;t end here, today, we&rsquo;re sharing the results of the first phase of our 2FA enrollment, with a call for more organizations to implement similar requirements across their own platforms. Let&rsquo;s dive in.</p>
  1031. <h2 id="results-%f0%9f%9a%80" id="results-%f0%9f%9a%80" >Results &#128640;<a href="#results-%f0%9f%9a%80" class="heading-link pl-2 text-italic text-bold" aria-label="Results &#128640;"></a></h2>
  1032. <p>We&rsquo;re proud of the initial achievements from the 2023 initiative, and the impact they&rsquo;ll have on ensuring the software ecosystem is more secure. We saw:</p>
  1033. <ul>
  1034. <li>Dramatic increase in 2FA adoption on GitHub.com, focused on users who have the most critical impact on the software supply chain. </li>
  1035. <li>Users adopting more secure means of 2FA, including passkeys.</li>
  1036. <li>Net reduction in 2FA-related support ticket volume, something we credit to heavy up-front user research and design as well as customer support process improvements. </li>
  1037. <li>Other organizations like <a href="https://blog.rubygems.org/2022/06/13/making-packages-more-secure.html">RubyGems</a>, <a href="https://blog.pypi.org/posts/2023-05-25-securing-pypi-with-2fa/">PyPI</a>, and <a href="https://aws.amazon.com/blogs/security/security-by-design-aws-to-enhance-mfa-requirements-in-2024/">AWS</a> joined us in raising the bar for the entire software supply chain, proving that large increases in 2FA adoption aren&rsquo;t an insurmountable challenge.</li>
  1038. </ul>
  1039. <h3 id="2fa-adoption" id="2fa-adoption" >2FA adoption<a href="#2fa-adoption" class="heading-link pl-2 text-italic text-bold" aria-label="2FA adoption"></a></h3>
  1040. <p>Since we began rolling out mandatory 2FA in March 2023, we&rsquo;ve seen an <strong>opt-in rate of nearly 95%</strong> across code contributors who received the 2FA requirement in 2023, and enrollments continue to trickle in. Moreover, this has led to a <strong>54% increase in 2FA adoption</strong> among all active contributors<sup id="fnref-77576-1"><a href="#fn-77576-1" class="jetpack-footnote" title="Read footnote.">1</a></sup> on GitHub.com.</p>
  1041. <p><img loading="lazy" decoding="async" src="https://github.blog/wp-content/uploads/2024/04/image2.png?w=1024&#038;resize=1024%2C412" alt="Graph showing the upward trend of total registered 2FA users from May 2023 to March 2024." width="1024" height="412" class="aligncenter size-large wp-image-77587 width-fit" srcset="https://github.blog/wp-content/uploads/2024/04/image2.png?w=1999 1999w, https://github.blog/wp-content/uploads/2024/04/image2.png?w=300 300w, https://github.blog/wp-content/uploads/2024/04/image2.png?w=768 768w, https://github.blog/wp-content/uploads/2024/04/image2.png?w=1024&#038;resize=1024%2C412 1024w, https://github.blog/wp-content/uploads/2024/04/image2.png?w=1536 1536w" sizes="(max-width: 1000px) 100vw, 1000px" data-recalc-dims="1" /></p>
  1042. <h3 id="stronger-and-more-reliable-authentication" id="stronger-and-more-reliable-authentication" >Stronger and more reliable authentication<a href="#stronger-and-more-reliable-authentication" class="heading-link pl-2 text-italic text-bold" aria-label="Stronger and more reliable authentication"></a></h3>
  1043. <p>A key area of focus for this initiative was encouraging users to adopt more secure means of 2FA, especially <a href="https://github.blog/2023-09-21-passkeys-are-generally-available/">passkeys</a> which currently offer the strongest mix of security and usability. Since we released passkeys to public beta in <a href="https://github.blog/2023-07-12-introducing-passwordless-authentication-on-github-com/">July 2023</a>, <strong>nearly 1.4 million passkeys have been registered on GitHub.com</strong>. Even more impressive, passkeys rapidly overtook other forms of Webauthn-backed 2FA in day-to-day usage.</p>
  1044. <p><img loading="lazy" decoding="async" src="https://github.blog/wp-content/uploads/2024/04/image5.png?w=1024&#038;resize=1024%2C400" alt="Graph showing Webauthn authentication success by type (passkey versus other) from July 2023 to March 2024. Passkeys surpassed all other types in November 2023, and the gap has widened since then." width="1024" height="400" class="aligncenter size-large wp-image-77588 width-fit" srcset="https://github.blog/wp-content/uploads/2024/04/image5.png?w=1999 1999w, https://github.blog/wp-content/uploads/2024/04/image5.png?w=300 300w, https://github.blog/wp-content/uploads/2024/04/image5.png?w=768 768w, https://github.blog/wp-content/uploads/2024/04/image5.png?w=1024&#038;resize=1024%2C400 1024w, https://github.blog/wp-content/uploads/2024/04/image5.png?w=1536 1536w" sizes="(max-width: 1000px) 100vw, 1000px" data-recalc-dims="1" /></p>
  1045. <p>While we&rsquo;re bullish on passkeys, it&rsquo;s also important that GitHub continues to offer flexibility, reliability, and security in the ways developers around the world can authenticate to the platform, particularly for those who may not have access to such technology. We continue to support SMS as a 2FA option for those who may not be able to adopt other factors, but have intentionally made design choices in our 2FA onboarding workflows to encourage users to adopt more secure alternatives where possible. This work <strong>reduced the overall share of SMS as a second factor by almost 25%</strong> between early 2023 and early 2024. We see a lot of room ahead to continue driving passkey adoption, while also driving down use of less-secure factor types, and foresee a future where passkeys are the first choice for the majority of developers on the GitHub platform.</p>
  1046. <p>Finally, as a result of our improved enrollment experience and passkey rollout, our data shows that it&rsquo;s <strong>47% more likely users will configure two or more forms of 2FA</strong>. Each additional factor makes it far less likely that a given user will lose all their factors and end up locked out, resulting in a smoother and more reliable user experience.</p>
  1047. <p><img loading="lazy" decoding="async" src="https://github.blog/wp-content/uploads/2024/04/image1.png?w=1024&#038;resize=1024%2C400" alt="Graph showing the number of users with 2 or more 2FA methods from April 2023 to March 2024. The line began trending rapidly upward in November 2023, becoming almost exponential in early 2024." width="1024" height="400" class="aligncenter size-large wp-image-77589 width-fit" srcset="https://github.blog/wp-content/uploads/2024/04/image1.png?w=1999 1999w, https://github.blog/wp-content/uploads/2024/04/image1.png?w=300 300w, https://github.blog/wp-content/uploads/2024/04/image1.png?w=768 768w, https://github.blog/wp-content/uploads/2024/04/image1.png?w=1024&#038;resize=1024%2C400 1024w, https://github.blog/wp-content/uploads/2024/04/image1.png?w=1536 1536w" sizes="(max-width: 1000px) 100vw, 1000px" data-recalc-dims="1" /></p>
  1048. <h3 id="user-experience-and-support" id="user-experience-and-support" >User experience and support<a href="#user-experience-and-support" class="heading-link pl-2 text-italic text-bold" aria-label="User experience and support"></a></h3>
  1049. <p>Knowing we needed to help developers employ strong account security while maintaining our promise of a seamless user experience, we invested in a number of improvements including refreshed 2FA onboarding flows, adding <a href="https://github.blog/2022-01-25-secure-your-github-account-github-mobile-2fa/">GitHub Mobile 2FA</a>, and more user options in terms of primary 2FA factors. While one would reasonably expect an increase in 2FA-related support tickets as the relative usage increased on the platform, we saw the opposite. Because of the significant investments in user experience and design ahead of the rollout, we saw a <strong>one-third reduction in 2FA-related support tickets</strong>.</p>
  1050. <p>Further, additional internal workflow optimization and automation for GitHub Support teams led to a <strong>54% reduction in 2FA account recovery support tickets that require significant human intervention</strong>. Today, <strong>more than 75% of account recovery tickets come through the in-product workflow</strong>, which collects recovery details from users and automatically checks for risk factors, as well as scenarios we know are safe (like doing account recovery while you&rsquo;re still signed in). This data collection and vetting dramatically reduces the time it takes for GitHub Support teams to review these recovery attempts, allowing locked out users to safely get back to their accounts faster than ever and enabling GitHub to scale 2FA enrollment to millions of users.</p>
  1051. <p><img loading="lazy" decoding="async" src="https://github.blog/wp-content/uploads/2024/04/image4.png?w=1024&#038;resize=1024%2C400" alt="Graph comparing 2FA account recovery tickets with tickets involving automated review from May 2023 to March 2024. The line representing automated review surpassed the line representing account recovery tickets around October 2023 and has stayed there ever since. " width="1024" height="400" class="aligncenter size-large wp-image-77590 width-fit" srcset="https://github.blog/wp-content/uploads/2024/04/image4.png?w=1999 1999w, https://github.blog/wp-content/uploads/2024/04/image4.png?w=300 300w, https://github.blog/wp-content/uploads/2024/04/image4.png?w=768 768w, https://github.blog/wp-content/uploads/2024/04/image4.png?w=1024&#038;resize=1024%2C400 1024w, https://github.blog/wp-content/uploads/2024/04/image4.png?w=1536 1536w" sizes="(max-width: 1000px) 100vw, 1000px" data-recalc-dims="1" /></p>
  1052. <p>We also introduced a <a href="https://github.blog/changelog/2023-01-11-second-factor-validation-after-2fa-setup">2FA verification checkup</a> that occurs 28 days after 2FA setup, to ensure users have an opportunity to verify their configuration. This checkup was a fail-safe that helped <strong>25% of users successfully reconfigure their accounts</strong> if they made a mistake or lost a factor, thereby avoiding account lockout for the user and significantly reducing account recovery support volume for GitHub.</p>
  1053. <p><img loading="lazy" decoding="async" src="https://github.blog/wp-content/uploads/2024/04/image3.png?w=1024&#038;resize=1024%2C400" alt="Screenshot of the dialog box prompting a user to verify their 2FA settings." width="1024" height="400" class="aligncenter size-large wp-image-77591 width-fit" srcset="https://github.blog/wp-content/uploads/2024/04/image3.png?w=1999 1999w, https://github.blog/wp-content/uploads/2024/04/image3.png?w=300 300w, https://github.blog/wp-content/uploads/2024/04/image3.png?w=768 768w, https://github.blog/wp-content/uploads/2024/04/image3.png?w=1024&#038;resize=1024%2C400 1024w, https://github.blog/wp-content/uploads/2024/04/image3.png?w=1536 1536w" sizes="(max-width: 1000px) 100vw, 1000px" data-recalc-dims="1" /></p>
  1054. <h3 id="ecosystem-impact" id="ecosystem-impact" >Ecosystem impact<a href="#ecosystem-impact" class="heading-link pl-2 text-italic text-bold" aria-label="Ecosystem impact"></a></h3>
  1055. <p>While our primary focus was to secure the developers on GitHub.com, we have also been intentionally transparent with our approach to the rollout to inspire more organizations to take up the call after GitHub and <a href="https://github.blog/2022-02-01-top-100-npm-package-maintainers-require-2fa-additional-security/">npm</a> to require their own 2FA requirements. Every user account with 2FA successfully enabled is one fewer vector for attackers to compromise organizations or important open source software. Over the last two years, we&rsquo;ve been encouraged to see <strong><a href="https://blog.rubygems.org/2022/06/13/making-packages-more-secure.html">RubyGems</a>, <a href="https://blog.pypi.org/posts/2023-05-25-securing-pypi-with-2fa/">PyPI</a>, and <a href="https://aws.amazon.com/blogs/security/security-by-design-aws-to-enhance-mfa-requirements-in-2024/">AWS</a> join our efforts to drive increased usage of 2FA to secure our shared ecosystem and software supply chain</strong>.</p>
  1056. <h2 id="looking-forward-%f0%9f%94%ad" id="looking-forward-%f0%9f%94%ad" >Looking forward &#128301;<a href="#looking-forward-%f0%9f%94%ad" class="heading-link pl-2 text-italic text-bold" aria-label="Looking forward &#128301;"></a></h2>
  1057. <p>Now that it&rsquo;s 2024, you might be asking, &ldquo;Why didn&rsquo;t I get a 2FA requirement?&rdquo; While we&rsquo;re ecstatic at the progress we made in 2023 to enroll millions of developers in 2FA, the job of securing the software supply chain and the developers responsible for it doesn&rsquo;t end. Our initial work <a href="https://docs.github.com/authentication/securing-your-account-with-two-factor-authentication-2fa/about-mandatory-two-factor-authentication">prioritized distinct user groups</a> based on the impact of their user privileges or specific actions they took.</p>
  1058. <aside class="post-aside--small float-sm-right col-sm-5 col-md-6 col-lg-5 my-5 my-sm-2 ml-sm-4 ml-lg-6"><p class="h6-mktg gh-aside-title">Protecting Accounts Without 2FA</p><p>Those who are not required to enable 2FA still benefit from layered protections such as <a href="https://github.blog/changelog/2019-07-01-verified-devices/">verified devices</a> and <a href="https://github.blog/changelog/2018-07-31-new-improvements-and-best-practices-for-account-security-and-recoverability/">compromised password prevention</a>.</p>
  1059. </aside>
  1060. <p>There is also still important industry-wide work ahead to support users that may not have access to a phone or control over the software of the computer they use to adopt 2FA. As a global platform, we believe that <em>everyone</em> should have access to tools that make software development easier and more secure, and our efforts to enforce strong authentication for as many developers as possible is ongoing. We&rsquo;ll continue to find solutions to protect developers, the projects they&rsquo;re working on, and the communities they participate in, working hard to take a balanced approach that greatly improves the security of the entire software supply chain without restricting those with different setups or environments around the world.</p>
  1061. <p>Looking ahead, we&rsquo;re evaluating how we can require even more GitHub.com users to enroll in 2FA during 2024, while continuing to monitor and improve the user experience. We&rsquo;re investigating additional account security features, such as session and token binding, that will enable developers and their organizations to better manage the risk of account compromise, with or without 2FA. We also want to continue to drive adoption of the most secure factors available to developers on the platform, such as passkeys or security keys, and help developers &ldquo;move up&rdquo; to more secure authenticator types. Throughout this, making security easy and effective <a href="https://github.blog/2021-02-24-hello-from-githubs-new-chief-security-officer/">remains a top priority</a>&mdash;after all, security that isn&rsquo;t usable isn&rsquo;t security at all.</p>
  1062. <h2 id="a-call-to-action-%f0%9f%93%a3" id="a-call-to-action-%f0%9f%93%a3" >A call to action &#128227;<a href="#a-call-to-action-%f0%9f%93%a3" class="heading-link pl-2 text-italic text-bold" aria-label="A call to action &#128227;"></a></h2>
  1063. <p>We all have a role to play in securing the software ecosystem, and platforms must commit to being both a responsible consumer of software and contributor back to it. <strong>GitHub chose to take on 2FA at scale because we believe it&rsquo;s the right thing to do to protect the entire ecosystem and we believe it&rsquo;s vital that other organizations join us</strong>. Our work here shows that it&rsquo;s possible to raise the bar for security significantly without negatively impacting users&rsquo; experiences. We encourage other organizations to strongly consider making 2FA requirements on their own platforms where possible.</p>
  1064. <p>If you&rsquo;d like to learn more about <em>how</em> we rolled out 2FA for millions of developers, look forward to a follow-up post that takes a deeper dive into our work in the coming weeks.</p>
  1065. <p>If you&rsquo;d like to join us in this effort, <a href="https://docs.github.com/authentication/securing-your-account-with-two-factor-authentication-2fa">enable 2FA on your own account</a>, <a href="https://docs.github.com/authentication/authenticating-with-a-passkey">adopt passkeys</a>, or <a href="https://docs.github.com/organizations/keeping-your-organization-secure/managing-two-factor-authentication-for-your-organization">require 2FA for your organization</a>.</p>
  1066. <p><em>Note: If you or your organization are implementing internal 2FA-related policy, please note that our requirements are not designed to cover all GitHub.com users. Read more about our current enrollment criteria <a href="https://docs.github.com/authentication/securing-your-account-with-two-factor-authentication-2fa/about-mandatory-two-factor-authentication">here</a> and consider <a href="https://docs.github.com/organizations/keeping-your-organization-secure/managing-two-factor-authentication-for-your-organization/requiring-two-factor-authentication-in-your-organization">requiring 2FA for your organization</a>.</em></p>
  1067. <div class="post-content-cta"><p>
  1068. <strong>Want to learn more about how GitHub can help you easily secure your code?</strong></p>
  1069. <p>At <a href="https://githubuniverse.com/">GitHub Universe 2024</a>, we&rsquo;ll explore cutting-edge research and best practices in developer-first security&mdash;empowering you to ship secure code fast.</p>
  1070. <p>Our Super Early Bird sale ends soon! <a href="https://githubuniverse.com/?utm_source=Blog&amp;utm_medium=GitHub&amp;utm_campaign=universe-blog">Buy your tickets now</a>.</p>
  1071. </div>
  1072. <div class="footnotes">
  1073. <hr>
  1074. <ol>
  1075. <li id="fn-77576-1">
  1076. Note that all active contributors includes users that made contributions, which didn&rsquo;t specifically qualify them for 2FA requirements, such as issue comments.&nbsp;<a href="#fnref-77576-1" title="Return to main content.">&#8617;</a>
  1077. </li>
  1078. </ol>
  1079. </div>
  1080. </body></html>
  1081. <p>The post <a href="https://github.blog/2024-04-24-securing-millions-of-developers-through-2fa/">Securing millions of developers through 2FA</a> appeared first on <a href="https://github.blog">The GitHub Blog</a>.</p>
  1082. ]]></content:encoded>
  1083. <post-id xmlns="com-wordpress:feed-additions:1">77576</post-id> </item>
  1084. <item>
  1085. <title>Using open source to help the earth</title>
  1086. <link>https://github.blog/2024-04-22-using-open-source-to-help-the-earth/</link>
  1087. <dc:creator><![CDATA[Paull Young]]></dc:creator>
  1088. <pubDate>Mon, 22 Apr 2024 15:00:46 +0000</pubDate>
  1089. <category><![CDATA[Open Source]]></category>
  1090. <category><![CDATA[Earth Day]]></category>
  1091. <category><![CDATA[social impact]]></category>
  1092. <category><![CDATA[sustainability]]></category>
  1093. <guid isPermaLink="false">https://github.blog/?p=77565</guid>
  1094.  
  1095. <description><![CDATA[<p>This Earth Day, we discuss how tech and open source are helping two organizations combat the effects of a changing climate.</p>
  1096. <p>The post <a href="https://github.blog/2024-04-22-using-open-source-to-help-the-earth/">Using open source to help the earth</a> appeared first on <a href="https://github.blog">The GitHub Blog</a>.</p>
  1097. ]]></description>
  1098. <content:encoded><![CDATA[<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
  1099. <html><body><p>When I start something new, I love to jump right in and get my feet wet (though, preferably in the Great Barrier Reef). As the new Environmental Sustainability lead at GitHub, this meant within the first few days of my job I was hearing directly from some of the incredible organizations that are leveraging tech to protect the environment.</p>
  1100. <p>Coming from Australia, my love for the ocean runs deep, as does my concern for how a changing climate is changing life for all of us around the world. So, I was thrilled to have a chance to speak with <strong>Kakani Katija, Principal Engineer at the <a href="https://www.mbari.org/">Monterey Bay Aquarium Research Institute (MBARI)</a></strong>, to see how her team is using open source to research our changing oceans.</p>
  1101. <p>Moving above ground, I also spoke with co-founders, <strong>Lassor Feasley, CEO, and Scott Schwartz, CTO at <a href="https://www.renewables.org/">Renewables.org</a></strong>. There&rsquo;s huge potential for solutions that both mitigate carbon and accelerate green power, as well as support the adaptation and resilience of communities that are going to feel the impact of climate change. Renewables.org encompasses this idea, and is using tech to bring it to life.</p>
  1102. <p>The future of our changing climate is tied inextricably to tech, and these leaders are showing how we can use open source to fight back.</p>
  1103. <p><strong>Paull Young</strong><br>
  1104. <em>Environmental Sustainability Senior Program Manager // GitHub</em></p>
  1105. <hr>
  1106. <h2 id="diving-into-monterey-bay-aquarium-research-institute" id="diving-into-monterey-bay-aquarium-research-institute" >Diving into Monterey Bay Aquarium Research Institute<a href="#diving-into-monterey-bay-aquarium-research-institute" class="heading-link pl-2 text-italic text-bold" aria-label="Diving into Monterey Bay Aquarium Research Institute"></a></h2>
  1107. <p><strong>Paull (GitHub):</strong> Kakani, I would love for you to tell us about MBARI&rsquo;s <a href="https://www.mbari.org/data/fathomnet/">FathomNet</a> project and the work you&rsquo;re currently doing.</p>
  1108. <p><img loading="lazy" decoding="async" src="https://github.blog/wp-content/uploads/2024/04/Kakani-Katija.jpg?w=300&#038;resize=300%2C233" alt="Headshot photograph of Kakani Katija. She is standing on a beach with the ocean visible behind her." width="300" height="233" class="alignleft size-medium wp-image-77568 width-fit" srcset="https://github.blog/wp-content/uploads/2024/04/Kakani-Katija.jpg?w=2040 2040w, https://github.blog/wp-content/uploads/2024/04/Kakani-Katija.jpg?w=300&#038;resize=300%2C233 300w, https://github.blog/wp-content/uploads/2024/04/Kakani-Katija.jpg?w=768 768w, https://github.blog/wp-content/uploads/2024/04/Kakani-Katija.jpg?w=1024 1024w, https://github.blog/wp-content/uploads/2024/04/Kakani-Katija.jpg?w=1536 1536w" sizes="(max-width: 300px) 100vw, 300px" data-recalc-dims="1" /></p>
  1109. <p><strong>Kakani (MBARI):</strong> MBARI cares about building technology and approaches that allow us to study a changing ocean. FathomNet, in particular, is really focused on how to monitor biological systems at scale in the ocean. This is incredibly important when talking about sustainability and climate change, as we have no idea how the blue economy and blue energy projects that are being pushed into the ocean will impact these existing biological communities. We hope that FathomNet will unleash the power of AI in the ocean, enabling the future of conservation, exploration, and discovery.</p>
  1110. <p><strong>Paull:</strong> I saw that you&rsquo;ll be coming out with a mobile game soon&mdash;what&rsquo;s the story behind that and how does it tap into the work you&rsquo;re already doing?</p>
  1111. <p><strong>Kakani:</strong> We have actually created a game that will be launching in May called <a href="https://www.fathomverse.game/">FathomVerse</a>. We&rsquo;ll be pushing data with machine-generated proposals to players who will identify what these different images are, and then community consensus labels will be created and pushed to FathomNet.</p>
  1112. <p>This was created because there are a limited number of experts in the world that can identify an animal down to a species or genus level from a visual or an image. But there are actually quite a few individuals in the world&mdash;from ocean enthusiasts to people who took a marine biology course&mdash;that could identify things that would have value to the research community.</p>
  1113. <p><strong>Paull:</strong> Do you need any training for that or can anyone download it and help contribute to your mission?</p>
  1114. <p><strong>Kakani:</strong> You&rsquo;ll get training through the game and feedback throughout. FathomNet is a source of labeled data and this is mixed in with the unlabeled data in the game. So, you&rsquo;ll get instant feedback when you&rsquo;re right or wrong or miss something, but then you&rsquo;ll also receive delayed feedback on how you compared to the rest of the community consensus.</p>
  1115. <p><strong>Paull:</strong> I love this. It&rsquo;s the nature of open source data that&rsquo;s underpinning this entire game and experience.</p>
  1116. <h2 id="reflecting-on-renewables-org" id="reflecting-on-renewables-org" >Reflecting on Renewables.org<a href="#reflecting-on-renewables-org" class="heading-link pl-2 text-italic text-bold" aria-label="Reflecting on Renewables.org"></a></h2>
  1117. <p><strong>Paull (GitHub):</strong> What&rsquo;s happening with Renewables.org is really exciting; can you tell me more about what your mission is and how your model works?</p>
  1118. <p><img loading="lazy" decoding="async" src="https://github.blog/wp-content/uploads/2024/04/Lassor-Feasley.png?w=300&#038;resize=300%2C300" alt="Headshot photograph of Lassor Feasley, a man with short dark hair wearing a tan sweater over a black collared shirt." width="300" height="300" class="alignleft size-medium wp-image-77569 width-fit" srcset="https://github.blog/wp-content/uploads/2024/04/Lassor-Feasley.png?w=500 500w, https://github.blog/wp-content/uploads/2024/04/Lassor-Feasley.png?w=150 150w, https://github.blog/wp-content/uploads/2024/04/Lassor-Feasley.png?w=300&#038;resize=300%2C300 300w, https://github.blog/wp-content/uploads/2024/04/Lassor-Feasley.png?w=400 400w, https://github.blog/wp-content/uploads/2024/04/Lassor-Feasley.png?w=200 200w, https://github.blog/wp-content/uploads/2024/04/Lassor-Feasley.png?w=90 90w, https://github.blog/wp-content/uploads/2024/04/Lassor-Feasley.png?w=116 116w" sizes="(max-width: 300px) 100vw, 300px" data-recalc-dims="1" /></p>
  1119. <p><strong>Lassor (Renewables.org):</strong> Renewables.org is the online solar investing nonprofit that&rsquo;s so far helped finance about a dozen solar projects across the Global South, including India and Africa. We&rsquo;ve chosen to finance projects in these regions because they&rsquo;re the places where you have the highest carbon impact per dollar&mdash;there&rsquo;s literally no other product or investment we&rsquo;ve evaluated that has a higher carbon impact.</p>
  1120. <p>Anyone can come to our site and buy a $25 share in one of our projects, and we pay it back monthly over five years. So, if you buy one panel, you&rsquo;ll start earning back your investment 42 cents at a time and you get fully repaid over five years. As you earn those repayments back, you can either withdraw them back to your personal account or use them to subsidize the purchase of even more panels and have an even greater investment.</p>
  1121. <p>This idea came about with one of our board level co-founders, Premal Shah. He&rsquo;s famous for having helped build <a href="http://Kiva.org">Kiva.org</a>&mdash;a very popular anti-poverty microfinance crowdfunding website.</p>
  1122. <p><strong>Paull:</strong> I know you&rsquo;re still in the earlier stages of your organization and the implementation of open source, but what do those next steps look like?</p>
  1123. <p><img loading="lazy" decoding="async" src="https://github.blog/wp-content/uploads/2024/04/Scott-Schwartz-1.jpg?w=300&#038;resize=300%2C300" alt="Headshot photograph of Scott Schwartz, who is wearing a white collared shirt under a grey blazer jacket. He is smiling and standing underneath a palm tree." width="300" height="300" class="alignleft size-medium wp-image-77570 width-fit" srcset="https://github.blog/wp-content/uploads/2024/04/Scott-Schwartz-1.jpg?w=594 594w, https://github.blog/wp-content/uploads/2024/04/Scott-Schwartz-1.jpg?w=150 150w, https://github.blog/wp-content/uploads/2024/04/Scott-Schwartz-1.jpg?w=300&#038;resize=300%2C300 300w, https://github.blog/wp-content/uploads/2024/04/Scott-Schwartz-1.jpg?w=400 400w, https://github.blog/wp-content/uploads/2024/04/Scott-Schwartz-1.jpg?w=200 200w, https://github.blog/wp-content/uploads/2024/04/Scott-Schwartz-1.jpg?w=90 90w, https://github.blog/wp-content/uploads/2024/04/Scott-Schwartz-1.jpg?w=116 116w" sizes="(max-width: 300px) 100vw, 300px" data-recalc-dims="1" /></p>
  1124. <p><strong>Scott (Renewables.org):</strong> We&rsquo;ve been identifying open source data we&rsquo;d like to integrate into the site&mdash;things like <a href="https://github.com/electricitymaps/electricitymaps-contrib">electricity maps</a>&mdash;and we&rsquo;re currently getting solar irradiation data from <a href="https://openweathermap.org/">OpenWeather</a>.</p>
  1125. <p>We&rsquo;re now planning for scale and would like to move towards an API-first setup for the site. Currently, we&rsquo;re using the standard features within GitHub (source control, issue tracking), but GitHub Copilot has come in handy as it&rsquo;s been many years since I worked with PHP and to say I&rsquo;m rusty would be generous.</p>
  1126. <h2 id="the-role-and-culture-of-open-source-in-sustainability" id="the-role-and-culture-of-open-source-in-sustainability" >The role and culture of open source in sustainability<a href="#the-role-and-culture-of-open-source-in-sustainability" class="heading-link pl-2 text-italic text-bold" aria-label="The role and culture of open source in sustainability"></a></h2>
  1127. <p><strong>Paull:</strong> Why is open source so important to the work that MBARI&rsquo;s FathomNet is doing and how are you engaging with that community?</p>
  1128. <p><strong>Kakani:</strong> Open data is incredibly important because data is collected in silos in the oceanographic community. It&rsquo;s often limited to individual groups or institutions that have access to the ocean through advanced robotics, research vessels, or something similar. <strong>But by making data public and more available following the FAIR data principles, we can democratize access to the ocean.</strong> So, that&rsquo;s one of the reasons why FathomNet exists&mdash;as a mechanism for people to evaluate imagery that&rsquo;s being collected and generate a data set of ocean life that we can build upon as a community and grow over time.</p>
  1129. <p><strong>Paull:</strong> Do you see any culture shifts happening where this type of data is trending more towards open source?</p>
  1130. <p><strong>Kakani:</strong> There is a **shift happening where people are starting to recognize that working in open source and making the data open and available is far more valuable to more people. **But it&rsquo;s a cultural change that takes time. I think we&rsquo;re kind of in that middle ground where there are still a lot of people waiting to see what happens before they&rsquo;re going to fully throw themselves and their data into the pipeline and process.</p>
  1131. <p>I&rsquo;m hopeful that what we&rsquo;ve done with FathomNet already and now with this game, we&rsquo;ll be able to create massive engagement at scale that will help get us over that fence and get a lot of people contributing within our community.</p>
  1132. <p><strong>Paull:</strong> How do you imagine open source will further the work Renewables.org is already doing?</p>
  1133. <p><strong>Lassor:</strong> We have created a methodology in open source around how we prove that these are the highest carbon impact per dollar solar projects that we could possibly fund. And the methodology has three parts:</p>
  1134. <ol>
  1135. <li>How much more carbon intensive is the project we&rsquo;re investing in than a typical U.S.-based project (usually two or three times)?</li>
  1136. <li>How much more sunshine is there each year (typically there&rsquo;s about 20% more)? </li>
  1137. <li>How many watts do you build per dollar (two or three times more watts for every dollar that you invest)? </li>
  1138. </ol>
  1139. <p>This comes out to about five times more carbon impact invested per dollar on Renewables.org than if you invested the same money in the United States.</p>
  1140. <p><strong>Scott:</strong> We&rsquo;ve been committed to <strong>making our calculator open source because trust is built with transparency, but also, if the community has a better way to estimate impact, we want to hear it!</strong> We want people to have faith in the platform and in the numbers that we&rsquo;re producing, and the community is great at vetting and improving this work.</p>
  1141. <h2 id="how-developers-and-communities-shape-your-work" id="how-developers-and-communities-shape-your-work" >How developers and communities shape your work<a href="#how-developers-and-communities-shape-your-work" class="heading-link pl-2 text-italic text-bold" aria-label="How developers and communities shape your work"></a></h2>
  1142. <p><strong>Paull:</strong> How have users or people interested in these topics shaped the work that you do?</p>
  1143. <p><strong>Kakani:</strong> We&rsquo;ve had more than a thousand unique players beta test FathomVerse, the game, and <strong>what we keep hearing is that they&rsquo;re really excited about this positive use of AI</strong>.There&rsquo;s a lot of negativity around AI and how information is being extracted as new models are trained. But because we&rsquo;re so transparent about where the source of the data is coming from, what its use is, and also what the goal is, game players have had a really positive response.</p>
  1144. <p><strong>Lassor:</strong> We learned a lot from Kiva.org&mdash;they have an incredibly engaged community that wants a huge amount of transparency. <strong>One thing that we learned from them before we even got started is that climate and sustainability related investments are the most in-demand feature.</strong> That&rsquo;s part of what gave us the confidence to do this.</p>
  1145. <p>There are different groups on Kiva.org that collaborate to fund certain types of loans, and the largest and most active one is called <a href="https://www.kiva.org/team/join/climatepilots">Climate Pilots</a>. And we&rsquo;ve been able to engage that community and recruit some of the very first Renewables.org users. We&rsquo;ve also been able to more broadly draw marketing insights by watching them and responding to what their needs are.</p>
  1146. <hr>
  1147. <p>From the sun to the depths of the ocean, the utilization of tech and open source in a changing climate is far-reaching. These two organizations show us just how big of an impact we can make by leveraging tech for good. To get involved with FathomNet, visit their <a href="https://www.mbari.org/data/fathomnet/">website</a> or <a href="https://github.com/fathomnet">repository</a>. To support Renewables.org&rsquo;s work, check out their <a href="https://www.renewables.org/invest">website</a> or add comments to their <a href="https://docs.google.com/spreadsheets/d/1vrzaPgeRQ81fnB96diU-gBqpAdlNa6RPuHEdvHf8Sqg/edit?usp=sharing">impact multiplier</a>.</p>
  1148. <aside class="p-4 p-md-6 post-aside--large"><p class="h5-mktg gh-aside-title">This is just a slice of open source innovation that is helping the Earth.</p><p>Check out our new series, Coding Sustainability, to learn how The Ocean Cleanup uses innovative technology and data-driven approaches to tackle the Great Pacific Garbage Patch.</p>
  1149. <p><iframe loading="lazy" width="560" height="315" src="https://www.youtube.com/embed/n5z4YcP5R18?si=GzwMiSumRVInuOHy" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe></p>
  1150.  
  1151. </aside>
  1152. </p></body></html>
  1153. <p>The post <a href="https://github.blog/2024-04-22-using-open-source-to-help-the-earth/">Using open source to help the earth</a> appeared first on <a href="https://github.blog">The GitHub Blog</a>.</p>
  1154. ]]></content:encoded>
  1155. <post-id xmlns="com-wordpress:feed-additions:1">77565</post-id> </item>
  1156. <item>
  1157. <title>A short guide to mastering keyboard shortcuts on GitHub</title>
  1158. <link>https://github.blog/2024-04-19-a-short-guide-to-mastering-keyboard-shortcuts-on-github/</link>
  1159. <dc:creator><![CDATA[Sara Verdi]]></dc:creator>
  1160. <pubDate>Fri, 19 Apr 2024 16:37:20 +0000</pubDate>
  1161. <category><![CDATA[Product]]></category>
  1162. <category><![CDATA[Github]]></category>
  1163. <category><![CDATA[Insider]]></category>
  1164. <category><![CDATA[productivity]]></category>
  1165. <category><![CDATA[tips]]></category>
  1166. <guid isPermaLink="false">https://github.blog/?p=77552</guid>
  1167.  
  1168. <description><![CDATA[<p>Say goodbye to constant mouse clicking and hello to seamless navigation with GitHub shortcuts. </p>
  1169. <p>The post <a href="https://github.blog/2024-04-19-a-short-guide-to-mastering-keyboard-shortcuts-on-github/">A short guide to mastering keyboard shortcuts on GitHub</a> appeared first on <a href="https://github.blog">The GitHub Blog</a>.</p>
  1170. ]]></description>
  1171. <content:encoded><![CDATA[<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
  1172. <html><body><div class="content-table-wrap"><table style="border: 1px black">
  1173. <tbody>
  1174. <tr>
  1175. <td>This is abridged content from November 2023&rsquo;s <em>Insider</em> newsletter. Like what you see? Sign up for the newsletter to receive complete, unabridged content in your inbox twice a month. <a href="https://resources.github.com/newsletter/">Sign up now &gt; </a></td>
  1176. </tr>
  1177. </tbody>
  1178. </table></div>
  1179. <p>Did you know that just about every page on GitHub has a keyboard shortcut? In this blog post, we&rsquo;ll uncover the world of <a href="https://docs.github.com/get-started/using-github/keyboard-shortcuts">GitHub keyboard shortcuts</a> and how they can help you navigate and perform actions swiftly. &#9000;&#65039;</p>
  1180. <p>After reading this post, you&rsquo;ll be able to:</p>
  1181. <p>&#128161; <strong>Master the shortcuts.</strong> You might be asking, how can I access said shortcuts? Simply by typing &ldquo;?&rdquo; on any Github page!* These shortcuts will empower you to perform various actions across the site without relying on your mouse.</p>
  1182. <p>&#128295; <strong>Customize your experience.</strong> You can tailor your shortcut experience by enabling or disabling character key shortcuts according to your preferences, all within your accessibility settings. For more information, see &ldquo;<a href="https://docs.github.com/account-and-profile/setting-up-and-managing-your-personal-account-on-github/managing-user-account-settings/managing-accessibility-settings">Managing accessibility settings</a>.&rdquo;</p>
  1183. <p>&#127913; <strong>Make magic.</strong> With the <a href="https://docs.github.com/get-started/using-github/github-command-palette">GitHub Command Palette</a>, you can effortlessly navigate, search, and execute commands on GitHub&mdash;all without the need to memorize multiple keyboard combinations. To open the command palette, type in this combination:</p>
  1184. <ul>
  1185. <li><strong>Windows and Linux:</strong> &ldquo;Ctrl+K&rdquo; or &ldquo;Ctrl+Alt+K&rdquo;</li>
  1186. <li><strong>Mac:</strong> &ldquo;Command+K&rdquo; or &ldquo;Command+Option+K&rdquo;</li>
  1187. </ul>
  1188. <p><em>Please note: not all shortcuts are available on every page. When you open the shortcut window (<kbd>?</kbd>), it will provide you with the available keyboard shortcuts.</em></p>
  1189. <figure id="attachment_77559"  class="wp-caption aligncenter mx-0"><img loading="lazy" decoding="async" width="600" height="338" src="https://github.blog/wp-content/uploads/2024/04/ezgif.com-gif-maker.gif?w=600&#038;resize=600%2C338" alt="Gif of a laptop with someone pressing keys and giving the thumbs up." class="width-fit size-large wp-image-77559 width-fit" data-recalc-dims="1"><figcaption class="text-mono color-fg-muted mt-14px f5-mktg">A gif of the author playing around with the notifications keyboard shortcut&mdash;and loving it!</figcaption></figure>
  1190. <h2 id="ready-to-give-your-mouse-a-break-lets-dive-into-some-top-keyboard-shortcuts-to-get-you-started" id="ready-to-give-your-mouse-a-break-lets-dive-into-some-top-keyboard-shortcuts-to-get-you-started" >Ready to give your mouse a break? Let&rsquo;s dive into some top keyboard shortcuts to get you started.<a href="#ready-to-give-your-mouse-a-break-lets-dive-into-some-top-keyboard-shortcuts-to-get-you-started" class="heading-link pl-2 text-italic text-bold" aria-label="Ready to give your mouse a break? Let&rsquo;s dive into some top keyboard shortcuts to get you started."></a></h2>
  1191. <h3 id="%f0%9f%9a%80-navigation" id="%f0%9f%9a%80-navigation" >&#128640; Navigation<a href="#%f0%9f%9a%80-navigation" class="heading-link pl-2 text-italic text-bold" aria-label="&#128640; Navigation"></a></h3>
  1192. <p>Tap these keys to navigate your way around our platform with ease:</p>
  1193. <p><kbd>T</kbd>: Quick access to &ldquo;File Finder.&rdquo;</p>
  1194. <p><kbd>W</kbd>: Close the currently open tab or pull request.</p>
  1195. <p><kbd>S</kbd>: Focus on the site search bar.</p>
  1196. <p><kbd>G</kbd>, <kbd>P</kbd>: Jump to your profile.</p>
  1197. <h3 id="%f0%9f%93%82-repository-navigation" id="%f0%9f%93%82-repository-navigation" >&#128194; Repository navigation<a href="#%f0%9f%93%82-repository-navigation" class="heading-link pl-2 text-italic text-bold" aria-label="&#128194; Repository navigation"></a></h3>
  1198. <p>These shortcuts will guide you through your repositories:</p>
  1199. <p><kbd>G</kbd>, <kbd>I</kbd>: Jump to your issues.</p>
  1200. <p><kbd>G</kbd>, <kbd>P</kbd>: Navigate to your pull requests.</p>
  1201. <p><kbd>G</kbd>, <kbd>B</kbd>: Head to your repository.</p>
  1202. <p><kbd>G</kbd>, <kbd>C</kbd>: Visit your repository&rsquo;s code.</p>
  1203. <h3 id="%f0%9f%93%9d-issues-and-pull-requests" id="%f0%9f%93%9d-issues-and-pull-requests" >&#128221; Issues and pull requests<a href="#%f0%9f%93%9d-issues-and-pull-requests" class="heading-link pl-2 text-italic text-bold" aria-label="&#128221; Issues and pull requests"></a></h3>
  1204. <p>Spin up issues and pull requests with one single keystroke:</p>
  1205. <p><kbd>C</kbd>: Create a new issue.</p>
  1206. <p><kbd>Y</kbd>: Close an issue or pull request.</p>
  1207. <p><kbd>R</kbd>: Reopen a closed issue or pull request.</p>
  1208. <p><kbd>K</kbd>: Move up the discussion timeline.</p>
  1209. <p><kbd>J</kbd>: Move down the discussion timeline.</p>
  1210. <h3 id="%f0%9f%94%8d-search" id="%f0%9f%94%8d-search" >&#128269; Search<a href="#%f0%9f%94%8d-search" class="heading-link pl-2 text-italic text-bold" aria-label="&#128269; Search"></a></h3>
  1211. <p>Quickly spin up a search bar to find what you need right when you need it:</p>
  1212. <p><kbd>/</kbd>: Start a quick search.</p>
  1213. <p><kbd>S</kbd>: Focus on the site search bar.</p>
  1214. <p><kbd>F</kbd>: Search within the code in a repository.</p>
  1215. <p><kbd>T</kbd>: File finder for code search.</p>
  1216. <p><kbd>W</kbd>: View code in a workspace.</p>
  1217. <h3 id="%f0%9f%93%8e-notifications" id="%f0%9f%93%8e-notifications" >&#128206; Notifications<a href="#%f0%9f%93%8e-notifications" class="heading-link pl-2 text-italic text-bold" aria-label="&#128206; Notifications"></a></h3>
  1218. <p>Stay on top of your projects with a hop on over to your notifications:</p>
  1219. <p><kbd>G</kbd>, <kbd>N</kbd>: Go to your notifications.</p>
  1220. <h3 id="%f0%9f%93%a4-create-and-submit" id="%f0%9f%93%a4-create-and-submit" >&#128228; Create and submit<a href="#%f0%9f%93%a4-create-and-submit" class="heading-link pl-2 text-italic text-bold" aria-label="&#128228; Create and submit"></a></h3>
  1221. <p>Spin up a new repository or view your issues in a flash:</p>
  1222. <p><kbd>N</kbd>: Create a new repository.</p>
  1223. <p><kbd>I</kbd>: Go to your issues.</p>
  1224. <p><kbd>P</kbd>: Navigate to your pull requests.</p>
  1225. <p><kbd>B</kbd>: Visit your repository.</p>
  1226. <h3 id="%f0%9f%94%92-security" id="%f0%9f%94%92-security" >&#128274; Security<a href="#%f0%9f%94%92-security" class="heading-link pl-2 text-italic text-bold" aria-label="&#128274; Security"></a></h3>
  1227. <p>Keep abreast of your security posture by navigating to your settings with ease:</p>
  1228. <p><kbd>G</kbd>, <kbd>S</kbd>: Navigate to your security settings.</p>
  1229. <p>With these keyboard shortcuts under your belt, you&rsquo;ll become a GitHub power user in no time. And remember, you don&rsquo;t have to commit all of these to memory&mdash;the <a href="https://docs.github.com/get-started/using-github/github-command-palette">GitHub Command Palette</a> has all that covered for you.</p>
  1230. <p>Want to know what other GitHub users&rsquo; favorite keyboard shortcuts are? Take a look through the comments on this <a href="https://www.linkedin.com/posts/github_githubdev-keyboard-shortcut-activity-7108860082779484160-sgap/?utm_source=share&amp;utm_medium=member_desktop">video</a>. And to further boost your productivity on GitHub, you can explore GitHub Actions&mdash;an integrated automation and CI/CD service within your repositories. GitHub Actions streamlines code-related tasks and development by defining event-triggered workflows; check it out today! Get started with <a href="https://github.com/features/actions">GitHub Actions</a>.</p>
  1231. <div class="post-content-cta"><p>Want to receive content like this twice a month, right in your inbox? <a href="https://resources.github.com/newsletter/">Sign up for the newsletter now &gt;</a></p>
  1232. </div>
  1233. </body></html>
  1234. <p>The post <a href="https://github.blog/2024-04-19-a-short-guide-to-mastering-keyboard-shortcuts-on-github/">A short guide to mastering keyboard shortcuts on GitHub</a> appeared first on <a href="https://github.blog">The GitHub Blog</a>.</p>
  1235. ]]></content:encoded>
  1236. <post-id xmlns="com-wordpress:feed-additions:1">77552</post-id> </item>
  1237. </channel>
  1238. </rss>
  1239.  

If you would like to create a banner that links to this page (i.e. this validation result), do the following:

  1. Download the "valid RSS" banner.

  2. Upload the image to your own server. (This step is important. Please do not link directly to the image on this server.)

  3. Add this HTML to your page (change the image src attribute if necessary):

If you would like to create a text link instead, here is the URL you can use:

http://www.feedvalidator.org/check.cgi?url=https%3A//github.blog/feed/

Copyright © 2002-9 Sam Ruby, Mark Pilgrim, Joseph Walton, and Phil Ringnalda