Heim  >  Artikel  >  Betrieb und Instandhaltung  >  Wie Codeql das Problem analysiert, dass Cookies httponly nicht aktivieren

Wie Codeql das Problem analysiert, dass Cookies httponly nicht aktivieren

PHPz
PHPznach vorne
2023-05-17 17:25:591254Durchsuche

sequence

Heute verwenden wir Codeql, um Sicherheitsprobleme wie „Cookie ist nicht aktiviert, httponly“ zu analysieren und so unsere Verwendung von Codeql zu vertiefen. Wenn es gut funktioniert, können Sie darüber nachdenken, weitere Schwachstellen in Vulnerability-goapp zu beheben.

Bei der Analyse von Go-Programmen müssen Sie zusätzlich codeql-go herunterladen. Anfällige Golang-Webanwendung für den Bildungsbereich.

Änderung

Da für alle Cookies in diesem Projekt nicht das Nur-http-Attribut festgelegt ist, müssen wir sie vor dem Vergleich zunächst ändern. Das Folgende ist eine Umformulierung des ursprünglichen Satzes: Datensatzänderung: Fügen Sie einigen Cookie-Einstellungen die Option „Nur http“ hinzu.

pkgadminadmin.go wird wie folgt geändert.

pkgloginlogin.go wird wie folgt geändert.


Wie Codeql das Problem analysiert, dass Cookies httponly nicht aktivierenpkgregisterregister.go wird wie folgt geändert.


Wie Codeql das Problem analysiert, dass Cookies httponly nicht aktivierenDenken Sie daran, die Datenbank nach der Änderung neu zu generieren (wenn Sie die alte Datenbank überschreiben müssen, müssen Sie zuerst die alte löschen und dann eine neue erstellen. #🎜 🎜##🎜🎜 #Zweck

Es besteht darin, mithilfe des Codeql-Skripts die Lücken zu finden, in denen httponly nicht festgelegt ist und httponly festgelegt ist, der Wert von httponly jedoch falsch ist (normalerweise ist dies nicht der Fall). , aber es ist nicht immer möglich) #🎜 🎜#
Quelle und Senke bestimmenWie Codeql das Problem analysiert, dass Cookies httponly nicht aktivieren

Senke-Definition

Senke ist sehr einfach Um die http.SetCookie-Methode zu verwenden, ist der festzulegende Cookie-Wert der zweite Parameter dieser Funktion. Anschließend können wir eine Abfrageanweisung schreiben, um eine Senke wie diese zu finden

import go
from DataFlow::Node sink
where exists(DataFlow::CallNode c |
      c.getTarget().hasQualifiedName("net/http", "SetCookie") and c.getArgument(1) = sink
    )
select sink

Nach dem Ausführen , können wir die folgenden Ergebnisse erhalten, um zum Codesegment der zusammengesetzten Anforderung zu springen folgt

private class Sink extends DataFlow::Node {
  Sink() {
    exists(DataFlow::CallNode c |
      c.getTarget().hasQualifiedName("net/http", "SetCookie") and c.getArgument(1) = this
    )
  }
}
Danach definieren wir eine Variable als Sink. Sie bezieht sich auf alle Codeausschnitte, die die Bedingungen erfüllen, zum Beispiel:

import go

private class Sink extends DataFlow::Node {
  Sink() {
    exists(DataFlow::CallNode c |
      c.getTarget().hasQualifiedName("net/http", "SetCookie") and c.getArgument(1) = this
    )
  }
}

from Sink s
select s

Das gleiche Ergebnis wird erhalten Nach dem Ausführen

Quellendefinition

Anhand der von der http.SetCookie-Methode empfangenen Parameter bestätigen wir, dass der eigentliche zweite Parameter ein Zeiger auf die Struktur ist erhält ein Cookie


Wie Codeql das Problem analysiert, dass Cookies httponly nicht aktivieren

Um eine solche Struktur zu finden, können wir zunächst alle Strukturen im Projekt auflisten

codeql-go ist wie folgt 🎜#

Also unser Abfrageskript zum Beispiel

import go

from StructLit source
select source

listet auch alle Strukturen auf, wie wir erwartet haben

#🎜 🎜##🎜 🎜#Der nächste Schritt besteht darin, andere irrelevante Inhalte zu entfernen und den Typ einzuschränken.

In Bezug auf die hasQualifiedName-Methode verfügen verschiedene Typen in verschiedenen Codeql-go über dieselbe Methode, die wie folgt definiert ist , Zu welchem ​​Paket gehört das markierte Objekt und wie lautet sein Name?


Wie Codeql das Problem analysiert, dass Cookies httponly nicht aktivierenWie Codeql das Problem analysiert, dass Cookies httponly nicht aktivierenWenn Sie sich nicht sicher sind, können Sie die relevanten Felder beispielsweise über getPackage und getName ausdrucken

.
import go

from StructLit source
// where source.getType().hasQualifiedName("net/http", "Cookie")
select source.getType().getPackage(), source.getType().getName()

Die Ergebnisse sind wie folgt


Wir können zum Beispiel die Quelldefinition finden #Wie Codeql das Problem analysiert, dass Cookies httponly nicht aktivieren wird auch in DataFlow konvertiert: :Eine Unterklasse von Node Senke, Sie können es erhalten, indem Sie einfach TaintConfig definieren. Alle Daten fließen von der Quelle zur Senke. Nr httponly=true Teilmenge. Daher müssen restriktive Bedingungen hinzugefügt werden, d. h. Datenströme, deren HttpOnly-Attribut auf „true“ gesetzt ist, werden von den Ergebnissen ausgeschlossen.

Wir können TaintTracking::isSanitizer von CodeQL verwenden, um harmlose Knoten zu filtern:

override predicate isSanitizer(DataFlow::Node node) {
    exists(Write w, Field f, DataFlow::Node rhs |
      f.hasQualifiedName("net/http", "Cookie", "HttpOnly") and
      w.writesField(node, f, rhs) and
      rhs.getBoolValue() = true
    )
  }

运行结果如下,但有一处地方需要注意。
Wie Codeql das Problem analysiert, dass Cookies httponly nicht aktivieren红框中实际有对HttpOnly进行设置,但我们的脚本并不能识别这样的一个数据流。后面试了各种方法,最终找到一种解决方式,将isSanitizer修改成以下内容。

override predicate isSanitizer(DataFlow::Node node) {
    exists(Write w, Field f, DataFlow::Node n, DataFlow::Node rhs |
      f.hasQualifiedName("net/http", "Cookie", "HttpOnly") and
      w.writesField(n, f, rhs) and
      rhs.getBoolValue() = true and
      node = n.getAPredecessor*()n
    )
  }

其中node=n.getAPredecessor*()是说node是n的前置数据流节点,数据可以在0个或多个步骤中从node流到n。

最终脚本

加上一些信息,模仿官方的示例,最终脚本如下。

/**
 * @name Cookie未设置httponly
 * @description Cookies包含一个HTTPOnly的设置选项,可以使此cookie不能被js读取,而只能用于HTTP请求。
 * @kind path-problem
 * @problem.severity error
 * @precision low
 * @id go/Cookie-not-set-httponly
 * @tags security
 */

import go
import DataFlow::PathGraph

private class Source extends DataFlow::Node {
  Source() {
    exists(StructLit s | s.getType().hasQualifiedName("net/http", "Cookie") and this.asExpr() = s)
  }
}

private class Sink extends DataFlow::Node {
  Sink() {
    exists(DataFlow::CallNode c |
      c.getTarget().hasQualifiedName("net/http", "SetCookie") and c.getArgument(1) = this
    )
  }
}

class Configuration extends TaintTracking::Configuration {
  Configuration() { this = "HttpOnly" }

  override predicate isSource(DataFlow::Node source) { source instanceof Source }

  override predicate isSink(DataFlow::Node sink) { sink instanceof Sink }

  override predicate isSanitizer(DataFlow::Node node) {
    exists(Write w, Field f, DataFlow::Node n, DataFlow::Node rhs |
      f.hasQualifiedName("net/http", "Cookie", "HttpOnly") and
      w.writesField(n, f, rhs) and
      rhs.getBoolValue() = true and
      node = n.getAPredecessor*()
    )
  }
}

from Configuration cfg, DataFlow::PathNode source, DataFlow::PathNode sink
where cfg.hasFlowPath(source, sink)
select sink.getNode(), source, sink, "Cookie-not-set-httponly in $@.", source.getNode(), "here"

最终筛选出存在问题的内容。
Wie Codeql das Problem analysiert, dass Cookies httponly nicht aktivieren

Das obige ist der detaillierte Inhalt vonWie Codeql das Problem analysiert, dass Cookies httponly nicht aktivieren. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen