Segurança de software não é o mesmo que software de segurança. Aqui, estamos interessados em tópicos como autenticação, controle de acesso, confidencialidade, criptografia e gestão de privilégios.
Exemplo 2: O código a seguir exclui o contêiner blob especificado e o respectivo conteúdo.
...
var queueName = queryStringData['name'];
var queueSvc;
queueSvc = azureStorage.createQueueService();
...
queueSvc.deleteQueue(queueName, option, function(error, response){
if(!error){
// all the messages has been deleted
}
});
...
...
var containerName = queryStringData['name'];
var blobSvc;
blobSvc = azureStorage.createBlobService();
...
blobSvc.deleteContainer(containerName, function (error, response) {
if (!error) {
// all the content in the given container has been deleted
}
});
...
Example 1
e no Example 2
exclua o contêiner da fila/blob especificado e as respectivas mensagens/conteúdo que pertencem ao usuário/programa atual, um invasor pode excluir qualquer fila/blob dessa conta Azure. Como o código nesse exemplo não realiza nenhuma verificação para garantir que o usuário/programa tenha permissão para limpar a fila/blob solicitado, ele limpará a fila/blob, mesmo que ela não pertença ao usuário/programa atual.
public boolean isTrusted(String paramString) {
if (this._applicationContext.getPackageName().equalsIgnoreCase(paramString)) {
return true;
}
DATA: id TYPE i.
...
id = request->get_form_field( 'invoiceID' ).
CONCATENATE `INVOICEID = '` id `'` INTO cl_where.
SELECT *
FROM invoices
INTO CORRESPONDING FIELDS OF TABLE itab_invoices
WHERE (cl_where).
ENDSELECT.
...
ID
. Embora a interface gere uma lista de identificadores de fatura que pertencem ao usuário atual, um invasor pode ignorar essa interface para solicitar qualquer fatura desejada. Como o código neste exemplo não faz nenhuma verificação para garantir que o usuário tem permissão para acessar a fatura solicitada, ele exibirá qualquer fatura, mesmo que ela não pertença ao usuário atual.
...
var params:Object = LoaderInfo(this.root.loaderInfo).parameters;
var id:int = int(Number(params["invoiceID"]));
var query:String = "SELECT * FROM invoices WHERE id = :id";
stmt.sqlConnection = conn;
stmt.text = query;
stmt.parameters[":id"] = id;
stmt.execute();
...
id
. Embora a interface gere uma lista de identificadores de fatura que pertencem ao usuário atual, um invasor pode ignorar essa interface para solicitar qualquer fatura desejada. Como o código neste exemplo não faz nenhuma verificação para garantir que o usuário tem permissão para acessar a fatura solicitada, ele exibirá qualquer fatura, mesmo que ela não pertença ao usuário atual.inputID
é originado de uma lista predefinida, e um variável de associação ajuda a prevenir a injeção de SOQL/SOSL.
...
result = [SELECT Name, Phone FROM Contact WHERE (IsDeleted = false AND Id=:inputID)];
...
inputID
. Se o invasor for capaz de ignorar a interface e enviar uma solicitação com um valor diferente, ele terá acesso a outras informações de contato. Como o código neste exemplo não verifica se o usuário tem permissão para acessar o contato solicitado, ele exibirá qualquer contato, mesmo que o usuário não esteja autorizado a vê-lo.
...
int16 id = System.Convert.ToInt16(invoiceID.Text);
var invoice = OrderSystem.getInvoices()
.Where(new Invoice { invoiceID = id });
...
id
. Embora a interface gere uma lista de identificadores de fatura que pertencem ao usuário atual, um invasor pode ignorar essa interface para solicitar qualquer fatura desejada. Como o código neste exemplo não faz nenhuma verificação para garantir que o usuário tem permissão para acessar a fatura solicitada, ele exibirá qualquer fatura, mesmo que ela não pertença ao usuário atual.
...
CMyRecordset rs(&dbms);
rs.PrepareSQL("SELECT * FROM invoices WHERE id = ?");
rs.SetParam_int(0,atoi(r.Lookup("invoiceID").c_str()));
rs.SafeExecuteSQL();
...
id
. Embora a interface gere uma lista de identificadores de fatura que pertencem ao usuário atual, um invasor pode ignorar essa interface para solicitar qualquer fatura desejada. Como o código neste exemplo não faz nenhuma verificação para garantir que o usuário tem permissão para acessar a fatura solicitada, ele exibirá qualquer fatura, mesmo que ela não pertença ao usuário atual.
...
ACCEPT ID.
EXEC SQL
DECLARE C1 CURSOR FOR
SELECT INVNO, INVDATE, INVTOTAL
FROM INVOICES
WHERE INVOICEID = :ID
END-EXEC.
...
ID
. Embora a interface gere uma lista de identificadores de fatura que pertencem ao usuário atual, um invasor pode ignorar essa interface para solicitar qualquer fatura desejada. Como o código neste exemplo não faz nenhuma verificação para garantir que o usuário tem permissão para acessar a fatura solicitada, ele exibirá qualquer fatura, mesmo que ela não pertença ao usuário atual.deleteDatabase
que contém um nome de banco de dados controlado pelo usuário pode permitir que um invasor exclua qualquer banco de dados.
...
id := request.FormValue("invoiceID")
query := "SELECT * FROM invoices WHERE id = ?";
rows, err := db.Query(query, id)
...
id
. Embora a interface gere uma lista de identificadores de fatura que pertencem ao usuário atual, um invasor pode ignorar essa interface para solicitar qualquer fatura desejada. Como o código neste exemplo não faz nenhuma verificação para garantir que o usuário tem permissão para acessar a fatura solicitada, ele exibirá qualquer fatura, mesmo que ela não pertença ao usuário atual.
...
id = Integer.decode(request.getParameter("invoiceID"));
String query = "SELECT * FROM invoices WHERE id = ?";
PreparedStatement stmt = conn.prepareStatement(query);
stmt.setInt(1, id);
ResultSet results = stmt.execute();
...
id
. Embora a interface gere uma lista de identificadores de fatura que pertencem ao usuário atual, um invasor pode ignorar essa interface para solicitar qualquer fatura desejada. Como o código neste exemplo não faz nenhuma verificação para garantir que o usuário tem permissão para acessar a fatura solicitada, ele exibirá qualquer fatura, mesmo que ela não pertença ao usuário atual.Example 1
à plataforma Android.
...
String id = this.getIntent().getExtras().getString("invoiceID");
String query = "SELECT * FROM invoices WHERE id = ?";
SQLiteDatabase db = this.openOrCreateDatabase("DB", MODE_PRIVATE, null);
Cursor c = db.rawQuery(query, new Object[]{id});
...
...
var id = document.form.invoiceID.value;
var query = "SELECT * FROM invoices WHERE id = ?";
db.transaction(function (tx) {
tx.executeSql(query,[id]);
}
)
...
id
. Embora a interface gere uma lista de identificadores de fatura que pertencem ao usuário atual, um invasor pode ignorar essa interface para solicitar qualquer fatura desejada. Como o código neste exemplo não faz nenhuma verificação para garantir que o usuário tem permissão para acessar a fatura solicitada, ele exibirá qualquer fatura, mesmo que ela não pertença ao usuário atual.
...
NSManagedObjectContext *context = [appDelegate managedObjectContext];
NSEntityDescription *entityDesc = [NSEntityDescription entityForName:@"Invoices" inManagedObjectContext:context];
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:entityDesc];
NSPredicate *pred = [NSPredicate predicateWithFormat:@"(id = %@)", invoiceId.text];
[request setPredicate:pred];
NSManagedObject *matches = nil;
NSError *error;
NSArray *objects = [context executeFetchRequest:request error:&error];
if ([objects count] == 0) {
status.text = @"No records found.";
} else {
matches = [objects objectAtIndex:0];
invoiceReferenceNumber.text = [matches valueForKey:@"invRefNum"];
orderNumber.text = [matches valueForKey:@"orderNumber"];
status.text = [NSString stringWithFormat:@"%d records found", [objects count]];
}
[request release];
...
id
. Embora a interface gere uma lista de identificadores de fatura que pertencem ao usuário atual, um invasor pode ignorar essa interface para solicitar qualquer fatura desejada. Como o código neste exemplo não faz nenhuma verificação para garantir que o usuário tem permissão para acessar a fatura solicitada, ele exibirá qualquer fatura, mesmo que ela não pertença ao usuário atual.
...
$id = $_POST['id'];
$query = "SELECT * FROM invoices WHERE id = ?";
$stmt = $mysqli->prepare($query);
$stmt->bind_param('ss',$id);
$stmt->execute();
...
id
. Embora a interface gere uma lista de identificadores de fatura que pertencem ao usuário atual, um invasor pode ignorar essa interface para solicitar qualquer fatura desejada. Como o código neste exemplo não faz nenhuma verificação para garantir que o usuário tem permissão para acessar a fatura solicitada, ele exibirá qualquer fatura, mesmo que ela não pertença ao usuário atual.
procedure get_item (
itm_cv IN OUT ItmCurTyp,
id in varchar2)
is
open itm_cv for ' SELECT * FROM items WHERE ' ||
'invoiceID = :invid' ||
using id;
end get_item;
id
. Embora a interface gere uma lista de identificadores de fatura que pertencem ao usuário atual, um invasor pode ignorar essa interface para solicitar qualquer fatura desejada. Como o código neste exemplo não faz nenhuma verificação para garantir que o usuário tem permissão para acessar a fatura solicitada, ele exibirá qualquer fatura, mesmo que ela não pertença ao usuário atual.
...
id = request.POST['id']
c = db.cursor()
stmt = c.execute("SELECT * FROM invoices WHERE id = %s", (id,))
...
id
. Embora a interface gere uma lista de identificadores de fatura que pertencem ao usuário atual, um invasor pode ignorar essa interface para solicitar qualquer fatura desejada. Como o código neste exemplo não faz nenhuma verificação para garantir que o usuário tem permissão para acessar a fatura solicitada, ele exibirá qualquer fatura, mesmo que ela não pertença ao usuário atual.
...
id = req['invoiceID'].respond_to(:to_int)
query = "SELECT * FROM invoices WHERE id=?"
stmt = conn.prepare(query)
stmt.execute(id)
...
id
. Embora a interface gere uma lista de identificadores de fatura que pertencem ao usuário atual, um invasor pode ignorar essa interface para solicitar qualquer fatura desejada. Como o código neste exemplo não faz nenhuma verificação para garantir que o usuário tem permissão para acessar a fatura solicitada, ele exibirá qualquer fatura, mesmo que ela não pertença ao usuário atual.
def searchInvoice(value:String) = Action.async { implicit request =>
val result: Future[Seq[Invoice]] = db.run {
sql"select * from invoices where id=$value".as[Invoice]
}
...
}
id
. Embora a interface gere uma lista de identificadores de fatura que pertencem ao usuário atual, um invasor pode ignorar essa interface para solicitar qualquer fatura desejada. Como o código neste exemplo não faz nenhuma verificação para garantir que o usuário tem permissão para acessar a fatura solicitada, ele exibirá qualquer fatura, mesmo que ela não pertença ao usuário atual.
...
let fetchRequest = NSFetchRequest()
let entity = NSEntityDescription.entityForName("Invoices", inManagedObjectContext: managedContext)
fetchRequest.entity = entity
let pred : NSPredicate = NSPredicate(format:"(id = %@)", invoiceId.text)
fetchRequest.setPredicate = pred
do {
let results = try managedContext.executeFetchRequest(fetchRequest)
let result : NSManagedObject = results.first!
invoiceReferenceNumber.text = result.valueForKey("invRefNum")
orderNumber.text = result.valueForKey("orderNumber")
status.text = "\(results.count) records found"
} catch let error as NSError {
print("Error \(error)")
}
...
id
. Embora a interface gere uma lista de identificadores de fatura que pertencem ao usuário atual, um invasor pode ignorar essa interface para solicitar qualquer fatura desejada. Como o código neste exemplo não faz nenhuma verificação para garantir que o usuário tem permissão para acessar a fatura solicitada, ele exibirá qualquer fatura, mesmo que ela não pertença ao usuário atual.
...
id = Request.Form("invoiceID")
strSQL = "SELECT * FROM invoices WHERE id = ?"
objADOCommand.CommandText = strSQL
objADOCommand.CommandType = adCmdText
set objADOParameter = objADOCommand.CreateParameter("id" , adString, adParamInput, 0, 0)
objADOCommand.Parameters("id") = id
...
id
. Embora a interface gere uma lista de identificadores de fatura que pertencem ao usuário atual, um invasor pode ignorar essa interface para solicitar qualquer fatura desejada. Como o código neste exemplo não faz nenhuma verificação para garantir que o usuário tem permissão para acessar a fatura solicitada, ele exibirá qualquer fatura, mesmo que ela não pertença ao usuário atual.
...
ACCEPT ID.
EXEC DLI
GU
SEGMENT(INVOICES)
WHERE (INVOICEID = ID)
END-EXEC.
...
ID
. Embora a interface gere uma lista de identificadores de fatura que pertencem ao usuário atual, um invasor pode ignorar essa interface para solicitar qualquer fatura desejada. Como o código neste exemplo não faz nenhuma verificação para garantir que o usuário tem permissão para acessar a fatura solicitada, ele exibirá qualquer fatura, mesmo que ela não pertença ao usuário atual.aspnet:UseLegacyFormsAuthenticationTicketCompatibility
para permitir que uma entrada não validada seja passada para as APIs nativas e pode fazer com que um invasor seja capaz de contornar a autenticação. Um invasor que explora com êxito esta vulnerabilidade seria capaz de ignorar a autenticação de formulários ASP.NET para qualquer nome de usuário conhecido sem sua senha. O invasor pode então realizar qualquer ação no contexto do usuário vítima, incluindo a execução de comandos arbitrários no site.aspnet:UseLegacyFormsAuthenticationTicketCompatibility
está definido como true
.
...
<appSettings>
<add key="aspnet:UseLegacyFormsAuthenticationTicketCompatibility" value="true" />
</appSettings>
...
Metadata
do Google Remote Procedure Call (gRPC) é criado com base em uma fonte não confiável.Metadata
é frequentemente usada para armazenar dados de cabeçalho para um protocolo subjacente usado pelo Google Remote Procedure Call (gRPC). Ao implementar a classe io.grpc.ServerInterceptor
, o objeto Metadata
deve ser validado antes de passar para o próximo objeto io.grpc.ServerCallHandler
. Especialmente quando o objeto Metadata
tem identidade de chamador.Metadata
do gRPC que é não validado antes de passar para o próximo objeto io.grpc.ServerCallHandler
:
class PotentialAuthByPassInterceptor implements ServerInterceptor {
@Override
public <ReqT, RespT> ServerCall.Listener<ReqT> interceptCall(ServerCall<ReqT, RespT> call, Metadata metadata, ServerCallHandler<ReqT, RespT> next) {
return Contexts.interceptCall(Context.current(), call, metadata, next);
}
}
static string AllowlistVerify(string name) {
Regex pattern = new Regex(@"^[a-zA-Z\-\.']+$");
if (pattern.IsMatch(name)) {
return name;
}
return null;
}
...
string verifiedName = AllowlistVerify(managerName.Text.trim());
if(verifiedName != null) {
DirectorySearcher src = new DirectorySearcher("(manager=" + verifiedName + ")");
src.SearchRoot = de;
src.SearchScope = SearchScope.Subtree;
foreach(SearchResult res in src.FindAll()) {
...
}
}
empName
. Embora a interface envie automaticamente a ID de funcionário do usuário atual, um invasor pode enviar um valor alternativo como parte de uma solicitação mal-intencionada. Como o código nesse exemplo executa a consulta sob uma associação anônima, ele retornará a entrada de diretório de qualquer ID de funcionário válida, independentemente da identidade do usuário autenticado atual.
char* allowlist_verify(char* name) {
const char *error;
int errOffset;
char* regex = "^[a-zA-Z\\-\\.']+$";
pcre* re = pcre_compile(regex, 0, &err, &errOffset, NULL);
int rc = pcre_exec(re, NULL, name, strlen(name), 0, 0, NULL, 0);
if (rc == 1)
return name;
return NULL;
}
...
fgets(managerName, sizeof(managerName), socket);
char* verified_name = allowlist_verify(managerName);
if(verified_name != NULL) {
snprintf(filter, sizeof(filter), "(manager=%s)", verified_name);
if ( ( rc = ldap_search_ext_s( ld, FIND_DN, LDAP_SCOPE_BASE,
filter, NULL, 0, NULL, NULL, LDAP_NO_LIMIT,
LDAP_NO_LIMIT, &result ) ) == LDAP_SUCCESS ) {
...
}
}
username
. Como o código nesse exemplo executa a consulta sob uma associação anônima, ele retornará a entrada de diretório de qualquer ID de funcionário válida, independentemente da identidade do usuário autenticado atual.
...
env.put(Context.SECURITY_AUTHENTICATION, "none");
DirContext ctx = new InitialDirContext(env);
String empID = request.getParameter("empID");
try
{
int id = Integer.parseInt(empID);
BasicAttribute attr = new BasicAttribute("empID", empID);
NamingEnumeration employee =
ctx.search("ou=People,dc=example,dc=com",attr);
...
empID
. Embora a interface envie automaticamente a ID de funcionário do usuário atual, um invasor pode enviar um valor alternativo como parte de uma solicitação mal-intencionada. Como o código nesse exemplo executa a consulta sob uma associação anônima, ele retornará a entrada de diretório de qualquer ID de funcionário válida, independentemente da identidade do usuário autenticado atual.