در دو قسمت قبلی نگاهی اجمالی به مراکز انتشار آسیبپذیریها، فرمتهای انتشار آسیبپذیری داشتم و همچنین نحوه نصب و پیکرهبندی گراف دیتابیس 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 به درستی در Neo4j وارد شدهاند میتوان از فراخوانی زیر استفاده کرد.
CALL graphql.schema()
برای کوئری گرفتن با استفاده از 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 آشنا شدهام، ممکن است این جستجوها بهینه نباشند. پس اگر جستجوهای بهینهتری میشناسید، خوشحال میشوم که در نظرات با من و بقیه خوانندگان به اشتراک بگذارید.