آسیب‌پذیری‌ها را جدی بگیریم! - قسمت سوم

فهرست

مقدمه

در دو قسمت قبلی نگاهی اجمالی به مراکز انتشار آسیب‌پذیری‌ها، فرمت‌های انتشار آسیب‌پذیری داشتم و همچنین نحوه نصب و پیکره‌بندی گراف دیتابیس Neo4j را بررسی کردم و اطلاعات مربوط به آسیب‌پذیری‌ها را در Neo4j وارد کردم.

اکنون زمان نمایش اطلاعات درج شده است.

دریافت اطلاعات یک آسیب‌پذیری بر اساس شناسه آن

فرض کنید که می‌خواهیم در داشبورد Neo4j اطلاعات مربوط به آسیب‌پذیری به شناسه CVE-2019-9978 را مشاهد کنیم. برای این کار می‌توانیم ابتدا دستور زیر را اجرا کرده و پس از دریافت گره(node) آسیب‌پذیری، آن را بسط می‌دهیم تا اطلاعات دیگر آن را هم مشاهده کنیم.

MATCH (n:CVE) WHERE n.name = 'CVE-2019-9977' RETURN n

دریافت اطلاعات یک آسیب‌پذیری بر اساس نام محصول و نسخه

فرض کنید که شما می‌خواهید برای نوشتن یک برنامه از پایتون نسخه 2.7.16 استفاده کنید. به راحتی و با اجرای دستور زیر می‌توانید آسیب‌پذیری‌های آن را مشاهده کنید.

MATCH (c:CVE)-[]->(v:ProductVersion)-[:VERSION_OF]->(p:Product) WHERE p.name = "python"  AND v.version_value = "2.7.16" RETURN p, v, c

بررسی آسیب‌پذیری یک کتابخانه

فرض کنید برای انجام پروژه‌ای به زبان پایتون می‌خواهید از کتابخانه urllib3 استفاده کنید. با استفاده از دستور زیر می‌توانید آسیب‌پذیری‌های مربوط به این کتابخانه با نسخه 1.24.1 را مشاهده کنید.

MATCH (c:CVE)-[]->(v:ProductVersion)-[:VERSION_OF]->(p:Product) WHERE p.name = "urllib3" AND v.version_value = "1.24.2" RETURN p, v, c

یافتن ضعف‌های امنیتی مرتبط با حافظه

یکی از گزارش‌هایی که می‌توان از این اطلاعات به دست آورد، آشنایی با آسیب‌پذیری‌ها و ضعف‌های امنیتی است. به عنوان مثال با اجرای دستور زیر می‌توانید ضغف‌های امنیتی مرتبط با حافظه را ببینید و بشناسید

MATCH (w:CWE) WHERE w.affected_resources = "::Memory::" RETURN w.name, w.title, w.affected_resources LIMIT 25

یافتن آسیب‌پذیری بر اساس یک ضعف امنیتی

فرض کنید که می‌خواهید متوجه شوید که نرم‌افزار فتوشاپی که با آن کار می‌کنید (به عنوان مثال فتوشاپ نسخه CC 2017.1.1) از ضعف امنیتی CWE-416 رنج می‌برد یا خیر؟ این ضعف امنیتی مربوط به شرایطی است که نرم‌افزار از حافظه‌ای استفاده می‌کند که قبلا آن را آزاد کرده است. برای به دست آوردن شماره نسخه فتوشاپی که گفته شد می‌توانید از لیست نسخه‌های فتوشاپ در ویکی‌پدیا استفاده کنید. شماره نسخه‌ای که عنوان شده برابر است با 18.1.1 است. پس با اجرای دستور زیر می‌توانید متوجه آسیب‌پذیری‌های مرتبط با این ضعف امنیتی شوید.

MATCH (c:CVE)-->(w:CWE {name: "CWE-416"}), (c)-->(v:ProductVersion {version_value: "18.1.1"})-->(p:Product {name: "photoshop"}) RETURN v, c, p, w LIMIT 25
به تفاوت فیلتر کردن گره‌ها در دستور اخیر و بقیه دستورها دقت کنید. در دستور اخیر فیلتر کردن در دستور MATCH انجام شده است و در دیگر دستورات در WHERE. هر دو روش صحیح هست و می‌توانید استفاده کنید.

بررسی Graphql

برای اینکه مطمئن شویم که تعاریف مربوط به Graphql به درستی در Neo4j وارد شده‌اند می‌توان از فراخوانی زیر استفاده کرد.

CALL graphql.schema()

نصب و راه Graphiql

برای کوئری گرفتن با استفاده از Graphql، اگر ابزاری ندارید پیشنهاد می‌کنم که ابزار Graphiql را نصب کنید و اجرا کنید. سپس در قسمت GraphQL Endpoint از آدرس http://localhost:7474/graphql استفاده نمایید.

اکنون می‌توانیم همان جستجوهایی که در داشبورد Neo4j و با استفاده از زبان Cypher انجام دادیم را با استفاده از زبان Graphql انجام دهیم.

دریافت اطلاعات یک آسیب‌پذیری بر اساس شناسه آن

query {
  CVE(name: "CVE-2019-9977") {
      name
      description
   }
}

دریافت اطلاعات یک آسیب‌پذیری بر اساس نام محصول و نسخه

query {
  ProductVersion(filter: {product: {name: "python"}, version_value: "2.7.16"}) {
    name
    version_value
    cves {
         name
     }
  }
}

بررسی آسیب‌پذیری یک کتابخانه

query {   
    ProductVersion(filter: {product: {name: "urllib3"}, version_value: "1.24.2"}) {
         name
         version_value
         cves {
              name
         } 
    }
}

یافتن ضعف‌های امنیتی مرتبط با حافظه

query {
  CWE (filter: {affected_resources: "::Memory::"}, first: 25) {
    name
    title
    affected_resources
  }
}

یافتن آسیب‌پذیری بر اساس یک ضعف امنیتی

query {
  CVE (filter: {
    	problems_single: {name: "CWE-416"},
    	productVersions_single: {version_value: "18.1.1", product: {name: "photoshop"}}
    }, first: 25) {
    name
    productVersions {
      name
      version_value
    }
    products {
      name
    }
    problems {
      name
    }
  }
}

از آن‌جایی که من به تازگی با Graphql آشنا شده‌ام، ممکن است این جستجو‌ها بهینه نباشند. پس اگر جستجو‌های بهینه‌تری می‌شناسید، خوشحال می‌شوم که در نظرات با من و بقیه خوانندگان به اشتراک بگذارید.