SCW图标
英雄背景无分隔线
博客

Rust est le langage de programmation le plus apprécié pour la cinquième fois. Est-ce notre nouveau sauveur en matière de sécurité ?

马蒂亚斯-马杜博士
出版日期: 2020 年 6 月 18 日
最后更新于 2026年3月8日

Ces dernières années, il semble que les ingénieurs logiciels du monde entier ne se lassent tout simplement pas de Rust pour la programmation. Ce langage de programmation de systèmes relativement nouveau, produit par Mozilla, a conquis le cœur de la communauté de Stack Overflow et, en tant que cohorte, il est peu probable qu'elle soit stupide lorsqu'elle vote pour un vote, le »langage de programmation le plus apprécié« Cinq années de suite, il est temps que nous prenions tous la parole et que nous en prenions note.

Le langage de programmation Rust intègre des éléments connus et fonctionnels issus de langages couramment utilisés, selon une philosophie différente qui élimine la complexité, tout en introduisant performance et sécurité. C'est une courbe d'apprentissage, et de nombreux développeurs n'ont pas vraiment l'occasion de jouer avec elle - seulement 5,1 % des personnes interrogées sur Stack Overflow couramment utilisé. Cela mis à part, il est indéniable qu'il s'agit d'un langage passionnant, doté d'une puissance de sécurité bien supérieure à celle de ses prédécesseurs, tels que le C et le C++. L'adoption massive va nécessiter des changements, à la fois comportementaux et technologiques... mais pour l'instant, elle attire toujours l'attention des développeurs sur le plan théorique.

... mais attendez, nous devons mettre en lumière une dernière chose : il est important de noter que Rust est un langage de programmation qui donne la priorité à la sécurité de la mémoire et à l'éradication des bogues de sécurité associés à des problèmes courants de gestion de la mémoire. C'est un gros problème (et cause sans aucun doute de nombreuses migraines pour les équipes AppSec), mais ce ne sont pas les seuls défis auxquels nous sommes confrontés en matière de codage sécurisé.

Qu'est-ce que Rust prévient exactement ? Et où sommes-nous encore exposés dans le paysage de la sécurité ? Découvrons la dernière licorne en matière de programmation :

La nouvelle frontière de la programmation de systèmes modernes et sûrs pour la mémoire

L'équipe de recherche et développement de Mozilla a travaillé sur des projets incroyables, et investir dans la programmation Rust en tant que pionnier de l'open source ne fait pas exception. Leur vidéo d'introduction donne un aperçu de leur philosophie, avec un thème clé très clair : l'approche actuelle de la sécurité logicielle est imparfaite, et Rust est conçu pour résoudre une grande partie de ce problème.

Cela semble trop simpliste, d'autant plus que nous sommes confrontés à d'énormes violations de données tous les deux jours, tout comme la récente erreur horrible signalée par easyJet. Des millions d'enregistrements de données sont fréquemment compromis, presque toujours à cause d'une vulnérabilité d'application Web, mauvaise configuration de la sécurité, ou attaque de phishing, et des langages tels que le C++ existent depuis des décennies. Cependant, les développeurs n'ont pas eu assez de temps pour les maîtriser au point de mettre en œuvre les meilleures pratiques de codage sécurisé. Pourquoi Rust devrait-il être différent ? De nouveaux langages sont déjà apparus, et ce n'est pas comme s'ils avaient trouvé le moyen d'éradiquer les vulnérabilités courantes ou de garantir que tout code écrit est magiquement parfait une fois compilé.

Aussi simple que soit le concept, ce sont parfois les réponses simples qui permettent de surmonter des questions complexes. Rust est, dans tous les sens du terme, une révolution dans la programmation de systèmes à mémoire sécurisée qui tient ses promesses à bien des égards... et il permet certainement d'économiser du temps aux développeurs qui sont susceptibles d'introduire des erreurs susceptibles de provoquer de gros problèmes si elles ne sont pas détectées. Java, C, C++ et même des langages plus récents tels que Kotlin et Golang restent assez impitoyables pour les développeurs peu soucieux de la sécurité. Avec ceux-ci, il n'y a aucun avertissement intégré, aucun signe particulier indiquant que la fonctionnalité géniale qui vient d'être compilée cache un gremlin de sécurité sous le capot.

Alors, approfondissons :

Qu'est-ce qui rend Rust si sûr ?

En général, l'objectif principal d'un développeur est de créer des fonctionnalités, de s'assurer qu'elles sont fonctionnelles et conviviales. Peut-être même une source de fierté qu'il serait heureux de mettre en valeur sur son CV. Il est tout à fait normal pour un développeur de créer un excellent logiciel, de le livrer et de passer au prochain grand projet. À ce stade, les équipes de sécurité vérifient les vulnérabilités et, si elles sont détectées, leur application « terminée » peut être renvoyée à leur équipe pour un correctif. Le problème peut être simple ou totalement hors de portée pour un développeur.

Le problème est qu'à première vue, les bogues de sécurité n'étaient pas du tout apparents, et si l'analyse, les tests et la révision manuelle du code ne parviennent pas à les détecter, un attaquant peut potentiellement profiter de cette petite fenêtre d'opportunité pour exploiter le bogue.

Maintenant, Rust cherche à empêcher de nombreuses vulnérabilités de pénétrer dans le code : il ne sera tout simplement pas compilé en cas d'erreurs de syntaxe ou d'autres bogues de sécurité de la mémoire qui entraînent des problèmes de production tout au long du SDLC. Il s'agit d'une programmation sécurisée de par sa conception, qui garantit qu'il n'y a aucun accès à une mémoire non valide (quelle que soit la manière dont le logiciel est exécuté). Et avec 70 % de tous les bogues de sécurité sont dus à des problèmes liés à la gestion de la mémoire, c'est une belle prouesse.

La rouille signalera et empêchera :

  • Débordement de la mémoire tampon
  • À utiliser gratuitement
  • Doublement gratuit
  • Déréférencement du pointeur nul
  • Utilisation de la mémoire non initialisée

Si nous comparons un extrait de code Rust avec du C++, il deviendra évident qu'il est sûr par défaut. Découvrez cet exemple de bogue de dépassement de mémoire tampon :

#include<iostream></iostream>
#include<string.h></string.h>
int main (void) {
caractère a [3] = « 12" ;
caractère b [4] = « 123 » ;
strcpy (a, b) ;//dépassement de la mémoire tampon lorsque len de b est supérieur à a
std : :cout << a << « ;" << b << std : :endl ;
}

Contre.

pub fn main () {
let mut a : [char ; 2] = [1, 2] ;
soit b : [caractère ; 3] = [1, 2, 3] ;
a.copy_from_slice (&b) ;
}
比较一个Rust代码片段

Rust émet un avertissement de sécurité et panique lorsqu'il atteint la fonction copy_from_slice au moment de l'exécution pour éviter tout débordement de la mémoire tampon, mais pas au moment de la compilation.

En ce sens, c'est vraiment l'une des langues du « départ à gauche ». Il mettra en évidence les erreurs et apprendra aux développeurs la bonne façon d'écrire du code afin d'éviter d'introduire des bogues de sécurité liés à la mémoire. Le respect des délais dépend donc de l'attention du codeur, de la correction et de la fidélité au chemin de livraison.

L'approche de ce langage semble simple, mais cela aurait été un exploit incroyable de le faire fonctionner avec cette puissante logique, et il va de soi. Du point de vue de la sécurité, Rust représente un grand pas en avant... si seulement davantage de personnes l'utilisaient. Des entreprises comme Dropbox sont les premières à utiliser son utilisation à grande échelle, et c'est formidable à voir. Mais il y a d'autres considérations avant de conclure qu'un problème d'adoption est la seule chose qui nous empêche d'avoir un avenir plus sûr.

Les comptes de Rust.

Il y a quelques petits (d'accord, gros) problèmes, à savoir que la programmation dans Rust est plus flexible qu'il n'y paraît pour introduire des bogues. Ce sera pas corrigez les 10 principales vulnérabilités de l'OWASP qui continuent de provoquer des violations, des retards et une culture générale de techniques de codage dangereuses. Il existe également une sorte de dynamique entre les anges et les démons, ou, comme on le sait plus généralement : Safe Rust ou Unsafe Rust.

Comme il est expliqué dans documentation officielle, Safe Rust est la « vraie » forme de Rust, et Unsafe Rust inclut des fonctions considérées comme « définitivement dangereuses », bien qu'elles soient parfois nécessaires, par exemple si l'intégration avec quelque chose dans un autre langage est requise. Cependant, même avec Unsafe Rust, la liste des fonctionnalités supplémentaires est encore limitée. Dans Unsafe Rust, il est possible d'effectuer les opérations suivantes dans des blocs non sécurisés :

  • Déréférencer les pointeurs bruts
  • Appelez des fonctions non sécurisées (y compris les fonctions C, les éléments intrinsèques du compilateur et l'allocateur brut)
  • Implémenter des traits dangereux
  • Muter la statique
  • Accédez aux domaines des syndicats.

Même dans un mode dit « non sécurisé », l'un des super pouvoirs de la programmation Rust fonctionne toujours : le « vérificateur d'emprunt ». Elle permet généralement d'éviter les problèmes de mémoire, les collisions lors de calculs parallèles et de nombreux autres bogues grâce à l'analyse statique du code, et cette analyse permet tout de même d'effectuer des vérifications dans un bloc non sécurisé. L'écriture de constructions non sécurisées demande simplement beaucoup plus de travail sans que le compilateur n'intervienne pour vous guider dans certaines situations.

Cela ne semble pas être un problème majeur pour la plupart des développeurs expérimentés. Après tout, nous sommes connus pour bricoler pour tirer le meilleur parti de nos applications et ouvrir des fonctions plus intéressantes, mais cela ouvre potentiellement un trou noir qui peut entraîner de graves erreurs de configuration et des failles de sécurité : un comportement indéfini. La programmation dans Rust (même lorsqu'elle n'est pas utilisée en toute sécurité) réduit assez bien les possibilités de vulnérabilités par rapport au C ou au C++, mais invoquer un comportement indéfini peut présenter un risque.

Est-ce la fin de la dépendance à l'égard du codage sécurisé piloté par les développeurs ?

Tu te souviens plus tôt quand j'ai dit que Rust avait des composants de langages connus ? L'une des principales failles de sécurité de Rust est qu'il contient des composants de langages bien connus, à savoir le C.

Rust est toujours un « langage de programmation sûr », mais encore une fois, c'est l'introduction d'un utilisateur qui permet de débloquer les choses. Le développeur peut toujours le modifier pour qu'il fonctionne sans signaler d'erreur (une proposition intéressante, car cela permet de débloquer plus de fonctionnalités), et essentiellement, même en toute sécurité, les développeurs peuvent toujours être aussi « dangereux » qu'ils le souhaitent, car ils disposent d'une couche de conseils et de protection avant que les choses ne prennent vraiment la forme d'une poire.

Et les deux scénarios ci-dessus deviennent de plus en plus dangereux à mesure que nous approfondissons, car les résultats de Rust sont similaires à ceux des outils d'analyse. Tout comme il n'existe aucun outil SAST/DAST/RAST/IAST de l'armée suisse qui analyse chaque vulnérabilité, chaque vecteur d'attaque et chaque problème, Rust ne le fait pas non plus. Même avec Rust certaines vulnérabilités peuvent encore être introduites assez facilement.

Le risque comportemental non défini lors de l'exécution de Unsafe Rust peut entraîner des problèmes de dépassement d'entiers, alors qu'en général, même les configurations sûres n'empêcheront pas les erreurs humaines dans les mauvaises configurations de sécurité, logique métier, ou en utilisant des composants présentant des vulnérabilités connues. Ces problèmes constituent toujours une menace bien réelle s'ils ne sont pas corrigés, et dans un environnement « supposé sûr » comme True Rust, cela peut même entraîner un certain comportement complaisant si un codeur pense que tous les problèmes majeurs seront détectés malgré tout.

J'ai découvert que Rust n'est pas sans rappeler un mentor en programmation : un ingénieur senior qui a pris le temps de s'asseoir avec un codeur moins expérimenté, de passer en revue son travail et de lui montrer les bogues potentiels, de souligner les gains d'efficacité et, dans certains cas, de s'assurer qu'il n'est pas compilé tant qu'il n'est pas correct. Cependant, il vaut mieux que les programmeurs de Rust apprennent la théorie et s'engagent eux-mêmes à appliquer les meilleures pratiques, car ce mentor pourrait bien vous couper les ficelles du tablier et vous ne voudriez pas être laissé pour compte.

Êtes-vous prêt à identifier et à corriger les vulnérabilités courantes de Rust dès maintenant ? Relève le défi.
显示资源
显示资源

Rust intègre des éléments connus et fonctionnels issus de langages couramment utilisés, selon une philosophie différente qui élimine la complexité, tout en introduisant performance et sécurité.

您想了解更多吗?

Matias Madou, Ph.D.是一位安全专家、研究员和CTO,也是Secure Code Warrior 的联合创始人。Matias在根特大学获得了应用安全的博士学位,主要研究静态分析解决方案。后来他加入了美国的Fortify公司,在那里他意识到,仅仅检测代码问题而不帮助开发人员编写安全代码是不够的。这激发了他开发产品的热情,帮助开发人员,减轻安全的负担,并超越客户的期望。当他不在办公桌前作为Awesome团队的一员时,他喜欢站在舞台上,在包括RSA会议、BlackHat和DefCon等会议上发表演讲。

了解更多

Secure Code Warrior 在整个软件开发周期中保障代码安全,并营造将网络安全置于首位的企业文化。无论您是应用安全负责人、开发人员、信息安全主管,还是其他任何参与安全工作的人员,我们都能协助您的组织降低不安全代码带来的风险。

预约演示
分享到:
领英品牌社交x 标志
作者
马蒂亚斯-马杜博士
发表于2020年6月18日

Matias Madou, Ph.D.是一位安全专家、研究员和CTO,也是Secure Code Warrior 的联合创始人。Matias在根特大学获得了应用安全的博士学位,主要研究静态分析解决方案。后来他加入了美国的Fortify公司,在那里他意识到,仅仅检测代码问题而不帮助开发人员编写安全代码是不够的。这激发了他开发产品的热情,帮助开发人员,减轻安全的负担,并超越客户的期望。当他不在办公桌前作为Awesome团队的一员时,他喜欢站在舞台上,在包括RSA会议、BlackHat和DefCon等会议上发表演讲。

马蒂亚斯是一名研究员和开发人员,拥有超过15年的软件安全实践经验。他曾为Fortify Software和他自己的公司Sensei Security等公司开发解决方案。在他的职业生涯中,马蒂亚斯领导了多个应用安全研究项目,并将其转化为商业产品,他拥有超过10项专利。当他离开办公桌时,Matias曾担任高级应用安全培训courses ,并定期在全球会议上发言,包括RSA会议、黑帽、DefCon、BSIMM、OWASP AppSec和BruCon。

马蒂亚斯拥有根特大学的计算机工程博士学位,在那里他研究了通过程序混淆来隐藏应用程序的内部工作的应用安全。

分享到:
领英品牌社交x 标志

Ces dernières années, il semble que les ingénieurs logiciels du monde entier ne se lassent tout simplement pas de Rust pour la programmation. Ce langage de programmation de systèmes relativement nouveau, produit par Mozilla, a conquis le cœur de la communauté de Stack Overflow et, en tant que cohorte, il est peu probable qu'elle soit stupide lorsqu'elle vote pour un vote, le »langage de programmation le plus apprécié« Cinq années de suite, il est temps que nous prenions tous la parole et que nous en prenions note.

Le langage de programmation Rust intègre des éléments connus et fonctionnels issus de langages couramment utilisés, selon une philosophie différente qui élimine la complexité, tout en introduisant performance et sécurité. C'est une courbe d'apprentissage, et de nombreux développeurs n'ont pas vraiment l'occasion de jouer avec elle - seulement 5,1 % des personnes interrogées sur Stack Overflow couramment utilisé. Cela mis à part, il est indéniable qu'il s'agit d'un langage passionnant, doté d'une puissance de sécurité bien supérieure à celle de ses prédécesseurs, tels que le C et le C++. L'adoption massive va nécessiter des changements, à la fois comportementaux et technologiques... mais pour l'instant, elle attire toujours l'attention des développeurs sur le plan théorique.

... mais attendez, nous devons mettre en lumière une dernière chose : il est important de noter que Rust est un langage de programmation qui donne la priorité à la sécurité de la mémoire et à l'éradication des bogues de sécurité associés à des problèmes courants de gestion de la mémoire. C'est un gros problème (et cause sans aucun doute de nombreuses migraines pour les équipes AppSec), mais ce ne sont pas les seuls défis auxquels nous sommes confrontés en matière de codage sécurisé.

Qu'est-ce que Rust prévient exactement ? Et où sommes-nous encore exposés dans le paysage de la sécurité ? Découvrons la dernière licorne en matière de programmation :

La nouvelle frontière de la programmation de systèmes modernes et sûrs pour la mémoire

L'équipe de recherche et développement de Mozilla a travaillé sur des projets incroyables, et investir dans la programmation Rust en tant que pionnier de l'open source ne fait pas exception. Leur vidéo d'introduction donne un aperçu de leur philosophie, avec un thème clé très clair : l'approche actuelle de la sécurité logicielle est imparfaite, et Rust est conçu pour résoudre une grande partie de ce problème.

Cela semble trop simpliste, d'autant plus que nous sommes confrontés à d'énormes violations de données tous les deux jours, tout comme la récente erreur horrible signalée par easyJet. Des millions d'enregistrements de données sont fréquemment compromis, presque toujours à cause d'une vulnérabilité d'application Web, mauvaise configuration de la sécurité, ou attaque de phishing, et des langages tels que le C++ existent depuis des décennies. Cependant, les développeurs n'ont pas eu assez de temps pour les maîtriser au point de mettre en œuvre les meilleures pratiques de codage sécurisé. Pourquoi Rust devrait-il être différent ? De nouveaux langages sont déjà apparus, et ce n'est pas comme s'ils avaient trouvé le moyen d'éradiquer les vulnérabilités courantes ou de garantir que tout code écrit est magiquement parfait une fois compilé.

Aussi simple que soit le concept, ce sont parfois les réponses simples qui permettent de surmonter des questions complexes. Rust est, dans tous les sens du terme, une révolution dans la programmation de systèmes à mémoire sécurisée qui tient ses promesses à bien des égards... et il permet certainement d'économiser du temps aux développeurs qui sont susceptibles d'introduire des erreurs susceptibles de provoquer de gros problèmes si elles ne sont pas détectées. Java, C, C++ et même des langages plus récents tels que Kotlin et Golang restent assez impitoyables pour les développeurs peu soucieux de la sécurité. Avec ceux-ci, il n'y a aucun avertissement intégré, aucun signe particulier indiquant que la fonctionnalité géniale qui vient d'être compilée cache un gremlin de sécurité sous le capot.

Alors, approfondissons :

Qu'est-ce qui rend Rust si sûr ?

En général, l'objectif principal d'un développeur est de créer des fonctionnalités, de s'assurer qu'elles sont fonctionnelles et conviviales. Peut-être même une source de fierté qu'il serait heureux de mettre en valeur sur son CV. Il est tout à fait normal pour un développeur de créer un excellent logiciel, de le livrer et de passer au prochain grand projet. À ce stade, les équipes de sécurité vérifient les vulnérabilités et, si elles sont détectées, leur application « terminée » peut être renvoyée à leur équipe pour un correctif. Le problème peut être simple ou totalement hors de portée pour un développeur.

Le problème est qu'à première vue, les bogues de sécurité n'étaient pas du tout apparents, et si l'analyse, les tests et la révision manuelle du code ne parviennent pas à les détecter, un attaquant peut potentiellement profiter de cette petite fenêtre d'opportunité pour exploiter le bogue.

Maintenant, Rust cherche à empêcher de nombreuses vulnérabilités de pénétrer dans le code : il ne sera tout simplement pas compilé en cas d'erreurs de syntaxe ou d'autres bogues de sécurité de la mémoire qui entraînent des problèmes de production tout au long du SDLC. Il s'agit d'une programmation sécurisée de par sa conception, qui garantit qu'il n'y a aucun accès à une mémoire non valide (quelle que soit la manière dont le logiciel est exécuté). Et avec 70 % de tous les bogues de sécurité sont dus à des problèmes liés à la gestion de la mémoire, c'est une belle prouesse.

La rouille signalera et empêchera :

  • Débordement de la mémoire tampon
  • À utiliser gratuitement
  • Doublement gratuit
  • Déréférencement du pointeur nul
  • Utilisation de la mémoire non initialisée

Si nous comparons un extrait de code Rust avec du C++, il deviendra évident qu'il est sûr par défaut. Découvrez cet exemple de bogue de dépassement de mémoire tampon :

#include<iostream></iostream>
#include<string.h></string.h>
int main (void) {
caractère a [3] = « 12" ;
caractère b [4] = « 123 » ;
strcpy (a, b) ;//dépassement de la mémoire tampon lorsque len de b est supérieur à a
std : :cout << a << « ;" << b << std : :endl ;
}

Contre.

pub fn main () {
let mut a : [char ; 2] = [1, 2] ;
soit b : [caractère ; 3] = [1, 2, 3] ;
a.copy_from_slice (&b) ;
}
比较一个Rust代码片段

Rust émet un avertissement de sécurité et panique lorsqu'il atteint la fonction copy_from_slice au moment de l'exécution pour éviter tout débordement de la mémoire tampon, mais pas au moment de la compilation.

En ce sens, c'est vraiment l'une des langues du « départ à gauche ». Il mettra en évidence les erreurs et apprendra aux développeurs la bonne façon d'écrire du code afin d'éviter d'introduire des bogues de sécurité liés à la mémoire. Le respect des délais dépend donc de l'attention du codeur, de la correction et de la fidélité au chemin de livraison.

L'approche de ce langage semble simple, mais cela aurait été un exploit incroyable de le faire fonctionner avec cette puissante logique, et il va de soi. Du point de vue de la sécurité, Rust représente un grand pas en avant... si seulement davantage de personnes l'utilisaient. Des entreprises comme Dropbox sont les premières à utiliser son utilisation à grande échelle, et c'est formidable à voir. Mais il y a d'autres considérations avant de conclure qu'un problème d'adoption est la seule chose qui nous empêche d'avoir un avenir plus sûr.

Les comptes de Rust.

Il y a quelques petits (d'accord, gros) problèmes, à savoir que la programmation dans Rust est plus flexible qu'il n'y paraît pour introduire des bogues. Ce sera pas corrigez les 10 principales vulnérabilités de l'OWASP qui continuent de provoquer des violations, des retards et une culture générale de techniques de codage dangereuses. Il existe également une sorte de dynamique entre les anges et les démons, ou, comme on le sait plus généralement : Safe Rust ou Unsafe Rust.

Comme il est expliqué dans documentation officielle, Safe Rust est la « vraie » forme de Rust, et Unsafe Rust inclut des fonctions considérées comme « définitivement dangereuses », bien qu'elles soient parfois nécessaires, par exemple si l'intégration avec quelque chose dans un autre langage est requise. Cependant, même avec Unsafe Rust, la liste des fonctionnalités supplémentaires est encore limitée. Dans Unsafe Rust, il est possible d'effectuer les opérations suivantes dans des blocs non sécurisés :

  • Déréférencer les pointeurs bruts
  • Appelez des fonctions non sécurisées (y compris les fonctions C, les éléments intrinsèques du compilateur et l'allocateur brut)
  • Implémenter des traits dangereux
  • Muter la statique
  • Accédez aux domaines des syndicats.

Même dans un mode dit « non sécurisé », l'un des super pouvoirs de la programmation Rust fonctionne toujours : le « vérificateur d'emprunt ». Elle permet généralement d'éviter les problèmes de mémoire, les collisions lors de calculs parallèles et de nombreux autres bogues grâce à l'analyse statique du code, et cette analyse permet tout de même d'effectuer des vérifications dans un bloc non sécurisé. L'écriture de constructions non sécurisées demande simplement beaucoup plus de travail sans que le compilateur n'intervienne pour vous guider dans certaines situations.

Cela ne semble pas être un problème majeur pour la plupart des développeurs expérimentés. Après tout, nous sommes connus pour bricoler pour tirer le meilleur parti de nos applications et ouvrir des fonctions plus intéressantes, mais cela ouvre potentiellement un trou noir qui peut entraîner de graves erreurs de configuration et des failles de sécurité : un comportement indéfini. La programmation dans Rust (même lorsqu'elle n'est pas utilisée en toute sécurité) réduit assez bien les possibilités de vulnérabilités par rapport au C ou au C++, mais invoquer un comportement indéfini peut présenter un risque.

Est-ce la fin de la dépendance à l'égard du codage sécurisé piloté par les développeurs ?

Tu te souviens plus tôt quand j'ai dit que Rust avait des composants de langages connus ? L'une des principales failles de sécurité de Rust est qu'il contient des composants de langages bien connus, à savoir le C.

Rust est toujours un « langage de programmation sûr », mais encore une fois, c'est l'introduction d'un utilisateur qui permet de débloquer les choses. Le développeur peut toujours le modifier pour qu'il fonctionne sans signaler d'erreur (une proposition intéressante, car cela permet de débloquer plus de fonctionnalités), et essentiellement, même en toute sécurité, les développeurs peuvent toujours être aussi « dangereux » qu'ils le souhaitent, car ils disposent d'une couche de conseils et de protection avant que les choses ne prennent vraiment la forme d'une poire.

Et les deux scénarios ci-dessus deviennent de plus en plus dangereux à mesure que nous approfondissons, car les résultats de Rust sont similaires à ceux des outils d'analyse. Tout comme il n'existe aucun outil SAST/DAST/RAST/IAST de l'armée suisse qui analyse chaque vulnérabilité, chaque vecteur d'attaque et chaque problème, Rust ne le fait pas non plus. Même avec Rust certaines vulnérabilités peuvent encore être introduites assez facilement.

Le risque comportemental non défini lors de l'exécution de Unsafe Rust peut entraîner des problèmes de dépassement d'entiers, alors qu'en général, même les configurations sûres n'empêcheront pas les erreurs humaines dans les mauvaises configurations de sécurité, logique métier, ou en utilisant des composants présentant des vulnérabilités connues. Ces problèmes constituent toujours une menace bien réelle s'ils ne sont pas corrigés, et dans un environnement « supposé sûr » comme True Rust, cela peut même entraîner un certain comportement complaisant si un codeur pense que tous les problèmes majeurs seront détectés malgré tout.

J'ai découvert que Rust n'est pas sans rappeler un mentor en programmation : un ingénieur senior qui a pris le temps de s'asseoir avec un codeur moins expérimenté, de passer en revue son travail et de lui montrer les bogues potentiels, de souligner les gains d'efficacité et, dans certains cas, de s'assurer qu'il n'est pas compilé tant qu'il n'est pas correct. Cependant, il vaut mieux que les programmeurs de Rust apprennent la théorie et s'engagent eux-mêmes à appliquer les meilleures pratiques, car ce mentor pourrait bien vous couper les ficelles du tablier et vous ne voudriez pas être laissé pour compte.

Êtes-vous prêt à identifier et à corriger les vulnérabilités courantes de Rust dès maintenant ? Relève le défi.
显示资源
显示资源

请填写以下表格以下载报告

我们希望获得您的授权,以便向您发送有关我们产品和/或安全编码相关主题的信息。我们将始终以最高标准谨慎处理您的个人数据,绝不会将其出售给其他企业用于营销目的。

提交
scw 成功图标
SCW 错误图标
要提交表单,请启用「Analytics」Cookie。完成操作后,请随时将其重新禁用。

Ces dernières années, il semble que les ingénieurs logiciels du monde entier ne se lassent tout simplement pas de Rust pour la programmation. Ce langage de programmation de systèmes relativement nouveau, produit par Mozilla, a conquis le cœur de la communauté de Stack Overflow et, en tant que cohorte, il est peu probable qu'elle soit stupide lorsqu'elle vote pour un vote, le »langage de programmation le plus apprécié« Cinq années de suite, il est temps que nous prenions tous la parole et que nous en prenions note.

Le langage de programmation Rust intègre des éléments connus et fonctionnels issus de langages couramment utilisés, selon une philosophie différente qui élimine la complexité, tout en introduisant performance et sécurité. C'est une courbe d'apprentissage, et de nombreux développeurs n'ont pas vraiment l'occasion de jouer avec elle - seulement 5,1 % des personnes interrogées sur Stack Overflow couramment utilisé. Cela mis à part, il est indéniable qu'il s'agit d'un langage passionnant, doté d'une puissance de sécurité bien supérieure à celle de ses prédécesseurs, tels que le C et le C++. L'adoption massive va nécessiter des changements, à la fois comportementaux et technologiques... mais pour l'instant, elle attire toujours l'attention des développeurs sur le plan théorique.

... mais attendez, nous devons mettre en lumière une dernière chose : il est important de noter que Rust est un langage de programmation qui donne la priorité à la sécurité de la mémoire et à l'éradication des bogues de sécurité associés à des problèmes courants de gestion de la mémoire. C'est un gros problème (et cause sans aucun doute de nombreuses migraines pour les équipes AppSec), mais ce ne sont pas les seuls défis auxquels nous sommes confrontés en matière de codage sécurisé.

Qu'est-ce que Rust prévient exactement ? Et où sommes-nous encore exposés dans le paysage de la sécurité ? Découvrons la dernière licorne en matière de programmation :

La nouvelle frontière de la programmation de systèmes modernes et sûrs pour la mémoire

L'équipe de recherche et développement de Mozilla a travaillé sur des projets incroyables, et investir dans la programmation Rust en tant que pionnier de l'open source ne fait pas exception. Leur vidéo d'introduction donne un aperçu de leur philosophie, avec un thème clé très clair : l'approche actuelle de la sécurité logicielle est imparfaite, et Rust est conçu pour résoudre une grande partie de ce problème.

Cela semble trop simpliste, d'autant plus que nous sommes confrontés à d'énormes violations de données tous les deux jours, tout comme la récente erreur horrible signalée par easyJet. Des millions d'enregistrements de données sont fréquemment compromis, presque toujours à cause d'une vulnérabilité d'application Web, mauvaise configuration de la sécurité, ou attaque de phishing, et des langages tels que le C++ existent depuis des décennies. Cependant, les développeurs n'ont pas eu assez de temps pour les maîtriser au point de mettre en œuvre les meilleures pratiques de codage sécurisé. Pourquoi Rust devrait-il être différent ? De nouveaux langages sont déjà apparus, et ce n'est pas comme s'ils avaient trouvé le moyen d'éradiquer les vulnérabilités courantes ou de garantir que tout code écrit est magiquement parfait une fois compilé.

Aussi simple que soit le concept, ce sont parfois les réponses simples qui permettent de surmonter des questions complexes. Rust est, dans tous les sens du terme, une révolution dans la programmation de systèmes à mémoire sécurisée qui tient ses promesses à bien des égards... et il permet certainement d'économiser du temps aux développeurs qui sont susceptibles d'introduire des erreurs susceptibles de provoquer de gros problèmes si elles ne sont pas détectées. Java, C, C++ et même des langages plus récents tels que Kotlin et Golang restent assez impitoyables pour les développeurs peu soucieux de la sécurité. Avec ceux-ci, il n'y a aucun avertissement intégré, aucun signe particulier indiquant que la fonctionnalité géniale qui vient d'être compilée cache un gremlin de sécurité sous le capot.

Alors, approfondissons :

Qu'est-ce qui rend Rust si sûr ?

En général, l'objectif principal d'un développeur est de créer des fonctionnalités, de s'assurer qu'elles sont fonctionnelles et conviviales. Peut-être même une source de fierté qu'il serait heureux de mettre en valeur sur son CV. Il est tout à fait normal pour un développeur de créer un excellent logiciel, de le livrer et de passer au prochain grand projet. À ce stade, les équipes de sécurité vérifient les vulnérabilités et, si elles sont détectées, leur application « terminée » peut être renvoyée à leur équipe pour un correctif. Le problème peut être simple ou totalement hors de portée pour un développeur.

Le problème est qu'à première vue, les bogues de sécurité n'étaient pas du tout apparents, et si l'analyse, les tests et la révision manuelle du code ne parviennent pas à les détecter, un attaquant peut potentiellement profiter de cette petite fenêtre d'opportunité pour exploiter le bogue.

Maintenant, Rust cherche à empêcher de nombreuses vulnérabilités de pénétrer dans le code : il ne sera tout simplement pas compilé en cas d'erreurs de syntaxe ou d'autres bogues de sécurité de la mémoire qui entraînent des problèmes de production tout au long du SDLC. Il s'agit d'une programmation sécurisée de par sa conception, qui garantit qu'il n'y a aucun accès à une mémoire non valide (quelle que soit la manière dont le logiciel est exécuté). Et avec 70 % de tous les bogues de sécurité sont dus à des problèmes liés à la gestion de la mémoire, c'est une belle prouesse.

La rouille signalera et empêchera :

  • Débordement de la mémoire tampon
  • À utiliser gratuitement
  • Doublement gratuit
  • Déréférencement du pointeur nul
  • Utilisation de la mémoire non initialisée

Si nous comparons un extrait de code Rust avec du C++, il deviendra évident qu'il est sûr par défaut. Découvrez cet exemple de bogue de dépassement de mémoire tampon :

#include<iostream></iostream>
#include<string.h></string.h>
int main (void) {
caractère a [3] = « 12" ;
caractère b [4] = « 123 » ;
strcpy (a, b) ;//dépassement de la mémoire tampon lorsque len de b est supérieur à a
std : :cout << a << « ;" << b << std : :endl ;
}

Contre.

pub fn main () {
let mut a : [char ; 2] = [1, 2] ;
soit b : [caractère ; 3] = [1, 2, 3] ;
a.copy_from_slice (&b) ;
}
比较一个Rust代码片段

Rust émet un avertissement de sécurité et panique lorsqu'il atteint la fonction copy_from_slice au moment de l'exécution pour éviter tout débordement de la mémoire tampon, mais pas au moment de la compilation.

En ce sens, c'est vraiment l'une des langues du « départ à gauche ». Il mettra en évidence les erreurs et apprendra aux développeurs la bonne façon d'écrire du code afin d'éviter d'introduire des bogues de sécurité liés à la mémoire. Le respect des délais dépend donc de l'attention du codeur, de la correction et de la fidélité au chemin de livraison.

L'approche de ce langage semble simple, mais cela aurait été un exploit incroyable de le faire fonctionner avec cette puissante logique, et il va de soi. Du point de vue de la sécurité, Rust représente un grand pas en avant... si seulement davantage de personnes l'utilisaient. Des entreprises comme Dropbox sont les premières à utiliser son utilisation à grande échelle, et c'est formidable à voir. Mais il y a d'autres considérations avant de conclure qu'un problème d'adoption est la seule chose qui nous empêche d'avoir un avenir plus sûr.

Les comptes de Rust.

Il y a quelques petits (d'accord, gros) problèmes, à savoir que la programmation dans Rust est plus flexible qu'il n'y paraît pour introduire des bogues. Ce sera pas corrigez les 10 principales vulnérabilités de l'OWASP qui continuent de provoquer des violations, des retards et une culture générale de techniques de codage dangereuses. Il existe également une sorte de dynamique entre les anges et les démons, ou, comme on le sait plus généralement : Safe Rust ou Unsafe Rust.

Comme il est expliqué dans documentation officielle, Safe Rust est la « vraie » forme de Rust, et Unsafe Rust inclut des fonctions considérées comme « définitivement dangereuses », bien qu'elles soient parfois nécessaires, par exemple si l'intégration avec quelque chose dans un autre langage est requise. Cependant, même avec Unsafe Rust, la liste des fonctionnalités supplémentaires est encore limitée. Dans Unsafe Rust, il est possible d'effectuer les opérations suivantes dans des blocs non sécurisés :

  • Déréférencer les pointeurs bruts
  • Appelez des fonctions non sécurisées (y compris les fonctions C, les éléments intrinsèques du compilateur et l'allocateur brut)
  • Implémenter des traits dangereux
  • Muter la statique
  • Accédez aux domaines des syndicats.

Même dans un mode dit « non sécurisé », l'un des super pouvoirs de la programmation Rust fonctionne toujours : le « vérificateur d'emprunt ». Elle permet généralement d'éviter les problèmes de mémoire, les collisions lors de calculs parallèles et de nombreux autres bogues grâce à l'analyse statique du code, et cette analyse permet tout de même d'effectuer des vérifications dans un bloc non sécurisé. L'écriture de constructions non sécurisées demande simplement beaucoup plus de travail sans que le compilateur n'intervienne pour vous guider dans certaines situations.

Cela ne semble pas être un problème majeur pour la plupart des développeurs expérimentés. Après tout, nous sommes connus pour bricoler pour tirer le meilleur parti de nos applications et ouvrir des fonctions plus intéressantes, mais cela ouvre potentiellement un trou noir qui peut entraîner de graves erreurs de configuration et des failles de sécurité : un comportement indéfini. La programmation dans Rust (même lorsqu'elle n'est pas utilisée en toute sécurité) réduit assez bien les possibilités de vulnérabilités par rapport au C ou au C++, mais invoquer un comportement indéfini peut présenter un risque.

Est-ce la fin de la dépendance à l'égard du codage sécurisé piloté par les développeurs ?

Tu te souviens plus tôt quand j'ai dit que Rust avait des composants de langages connus ? L'une des principales failles de sécurité de Rust est qu'il contient des composants de langages bien connus, à savoir le C.

Rust est toujours un « langage de programmation sûr », mais encore une fois, c'est l'introduction d'un utilisateur qui permet de débloquer les choses. Le développeur peut toujours le modifier pour qu'il fonctionne sans signaler d'erreur (une proposition intéressante, car cela permet de débloquer plus de fonctionnalités), et essentiellement, même en toute sécurité, les développeurs peuvent toujours être aussi « dangereux » qu'ils le souhaitent, car ils disposent d'une couche de conseils et de protection avant que les choses ne prennent vraiment la forme d'une poire.

Et les deux scénarios ci-dessus deviennent de plus en plus dangereux à mesure que nous approfondissons, car les résultats de Rust sont similaires à ceux des outils d'analyse. Tout comme il n'existe aucun outil SAST/DAST/RAST/IAST de l'armée suisse qui analyse chaque vulnérabilité, chaque vecteur d'attaque et chaque problème, Rust ne le fait pas non plus. Même avec Rust certaines vulnérabilités peuvent encore être introduites assez facilement.

Le risque comportemental non défini lors de l'exécution de Unsafe Rust peut entraîner des problèmes de dépassement d'entiers, alors qu'en général, même les configurations sûres n'empêcheront pas les erreurs humaines dans les mauvaises configurations de sécurité, logique métier, ou en utilisant des composants présentant des vulnérabilités connues. Ces problèmes constituent toujours une menace bien réelle s'ils ne sont pas corrigés, et dans un environnement « supposé sûr » comme True Rust, cela peut même entraîner un certain comportement complaisant si un codeur pense que tous les problèmes majeurs seront détectés malgré tout.

J'ai découvert que Rust n'est pas sans rappeler un mentor en programmation : un ingénieur senior qui a pris le temps de s'asseoir avec un codeur moins expérimenté, de passer en revue son travail et de lui montrer les bogues potentiels, de souligner les gains d'efficacité et, dans certains cas, de s'assurer qu'il n'est pas compilé tant qu'il n'est pas correct. Cependant, il vaut mieux que les programmeurs de Rust apprennent la théorie et s'engagent eux-mêmes à appliquer les meilleures pratiques, car ce mentor pourrait bien vous couper les ficelles du tablier et vous ne voudriez pas être laissé pour compte.

Êtes-vous prêt à identifier et à corriger les vulnérabilités courantes de Rust dès maintenant ? Relève le défi.
查看网络研讨会
开始
了解更多

点击下方链接,下载此资源的PDF文件。

Secure Code Warrior 在整个软件开发周期中保障代码安全,并营造将网络安全置于首位的企业文化。无论您是应用安全负责人、开发人员、信息安全主管,还是其他任何参与安全工作的人员,我们都能协助您的组织降低不安全代码带来的风险。

显示报告预约演示
下载PDF文件
显示资源
分享到:
领英品牌社交x 标志
您想了解更多吗?

分享到:
领英品牌社交x 标志
作者
马蒂亚斯-马杜博士
发表于2020年6月18日

Matias Madou, Ph.D.是一位安全专家、研究员和CTO,也是Secure Code Warrior 的联合创始人。Matias在根特大学获得了应用安全的博士学位,主要研究静态分析解决方案。后来他加入了美国的Fortify公司,在那里他意识到,仅仅检测代码问题而不帮助开发人员编写安全代码是不够的。这激发了他开发产品的热情,帮助开发人员,减轻安全的负担,并超越客户的期望。当他不在办公桌前作为Awesome团队的一员时,他喜欢站在舞台上,在包括RSA会议、BlackHat和DefCon等会议上发表演讲。

马蒂亚斯是一名研究员和开发人员,拥有超过15年的软件安全实践经验。他曾为Fortify Software和他自己的公司Sensei Security等公司开发解决方案。在他的职业生涯中,马蒂亚斯领导了多个应用安全研究项目,并将其转化为商业产品,他拥有超过10项专利。当他离开办公桌时,Matias曾担任高级应用安全培训courses ,并定期在全球会议上发言,包括RSA会议、黑帽、DefCon、BSIMM、OWASP AppSec和BruCon。

马蒂亚斯拥有根特大学的计算机工程博士学位,在那里他研究了通过程序混淆来隐藏应用程序的内部工作的应用安全。

分享到:
领英品牌社交x 标志

Ces dernières années, il semble que les ingénieurs logiciels du monde entier ne se lassent tout simplement pas de Rust pour la programmation. Ce langage de programmation de systèmes relativement nouveau, produit par Mozilla, a conquis le cœur de la communauté de Stack Overflow et, en tant que cohorte, il est peu probable qu'elle soit stupide lorsqu'elle vote pour un vote, le »langage de programmation le plus apprécié« Cinq années de suite, il est temps que nous prenions tous la parole et que nous en prenions note.

Le langage de programmation Rust intègre des éléments connus et fonctionnels issus de langages couramment utilisés, selon une philosophie différente qui élimine la complexité, tout en introduisant performance et sécurité. C'est une courbe d'apprentissage, et de nombreux développeurs n'ont pas vraiment l'occasion de jouer avec elle - seulement 5,1 % des personnes interrogées sur Stack Overflow couramment utilisé. Cela mis à part, il est indéniable qu'il s'agit d'un langage passionnant, doté d'une puissance de sécurité bien supérieure à celle de ses prédécesseurs, tels que le C et le C++. L'adoption massive va nécessiter des changements, à la fois comportementaux et technologiques... mais pour l'instant, elle attire toujours l'attention des développeurs sur le plan théorique.

... mais attendez, nous devons mettre en lumière une dernière chose : il est important de noter que Rust est un langage de programmation qui donne la priorité à la sécurité de la mémoire et à l'éradication des bogues de sécurité associés à des problèmes courants de gestion de la mémoire. C'est un gros problème (et cause sans aucun doute de nombreuses migraines pour les équipes AppSec), mais ce ne sont pas les seuls défis auxquels nous sommes confrontés en matière de codage sécurisé.

Qu'est-ce que Rust prévient exactement ? Et où sommes-nous encore exposés dans le paysage de la sécurité ? Découvrons la dernière licorne en matière de programmation :

La nouvelle frontière de la programmation de systèmes modernes et sûrs pour la mémoire

L'équipe de recherche et développement de Mozilla a travaillé sur des projets incroyables, et investir dans la programmation Rust en tant que pionnier de l'open source ne fait pas exception. Leur vidéo d'introduction donne un aperçu de leur philosophie, avec un thème clé très clair : l'approche actuelle de la sécurité logicielle est imparfaite, et Rust est conçu pour résoudre une grande partie de ce problème.

Cela semble trop simpliste, d'autant plus que nous sommes confrontés à d'énormes violations de données tous les deux jours, tout comme la récente erreur horrible signalée par easyJet. Des millions d'enregistrements de données sont fréquemment compromis, presque toujours à cause d'une vulnérabilité d'application Web, mauvaise configuration de la sécurité, ou attaque de phishing, et des langages tels que le C++ existent depuis des décennies. Cependant, les développeurs n'ont pas eu assez de temps pour les maîtriser au point de mettre en œuvre les meilleures pratiques de codage sécurisé. Pourquoi Rust devrait-il être différent ? De nouveaux langages sont déjà apparus, et ce n'est pas comme s'ils avaient trouvé le moyen d'éradiquer les vulnérabilités courantes ou de garantir que tout code écrit est magiquement parfait une fois compilé.

Aussi simple que soit le concept, ce sont parfois les réponses simples qui permettent de surmonter des questions complexes. Rust est, dans tous les sens du terme, une révolution dans la programmation de systèmes à mémoire sécurisée qui tient ses promesses à bien des égards... et il permet certainement d'économiser du temps aux développeurs qui sont susceptibles d'introduire des erreurs susceptibles de provoquer de gros problèmes si elles ne sont pas détectées. Java, C, C++ et même des langages plus récents tels que Kotlin et Golang restent assez impitoyables pour les développeurs peu soucieux de la sécurité. Avec ceux-ci, il n'y a aucun avertissement intégré, aucun signe particulier indiquant que la fonctionnalité géniale qui vient d'être compilée cache un gremlin de sécurité sous le capot.

Alors, approfondissons :

Qu'est-ce qui rend Rust si sûr ?

En général, l'objectif principal d'un développeur est de créer des fonctionnalités, de s'assurer qu'elles sont fonctionnelles et conviviales. Peut-être même une source de fierté qu'il serait heureux de mettre en valeur sur son CV. Il est tout à fait normal pour un développeur de créer un excellent logiciel, de le livrer et de passer au prochain grand projet. À ce stade, les équipes de sécurité vérifient les vulnérabilités et, si elles sont détectées, leur application « terminée » peut être renvoyée à leur équipe pour un correctif. Le problème peut être simple ou totalement hors de portée pour un développeur.

Le problème est qu'à première vue, les bogues de sécurité n'étaient pas du tout apparents, et si l'analyse, les tests et la révision manuelle du code ne parviennent pas à les détecter, un attaquant peut potentiellement profiter de cette petite fenêtre d'opportunité pour exploiter le bogue.

Maintenant, Rust cherche à empêcher de nombreuses vulnérabilités de pénétrer dans le code : il ne sera tout simplement pas compilé en cas d'erreurs de syntaxe ou d'autres bogues de sécurité de la mémoire qui entraînent des problèmes de production tout au long du SDLC. Il s'agit d'une programmation sécurisée de par sa conception, qui garantit qu'il n'y a aucun accès à une mémoire non valide (quelle que soit la manière dont le logiciel est exécuté). Et avec 70 % de tous les bogues de sécurité sont dus à des problèmes liés à la gestion de la mémoire, c'est une belle prouesse.

La rouille signalera et empêchera :

  • Débordement de la mémoire tampon
  • À utiliser gratuitement
  • Doublement gratuit
  • Déréférencement du pointeur nul
  • Utilisation de la mémoire non initialisée

Si nous comparons un extrait de code Rust avec du C++, il deviendra évident qu'il est sûr par défaut. Découvrez cet exemple de bogue de dépassement de mémoire tampon :

#include<iostream></iostream>
#include<string.h></string.h>
int main (void) {
caractère a [3] = « 12" ;
caractère b [4] = « 123 » ;
strcpy (a, b) ;//dépassement de la mémoire tampon lorsque len de b est supérieur à a
std : :cout << a << « ;" << b << std : :endl ;
}

Contre.

pub fn main () {
let mut a : [char ; 2] = [1, 2] ;
soit b : [caractère ; 3] = [1, 2, 3] ;
a.copy_from_slice (&b) ;
}
比较一个Rust代码片段

Rust émet un avertissement de sécurité et panique lorsqu'il atteint la fonction copy_from_slice au moment de l'exécution pour éviter tout débordement de la mémoire tampon, mais pas au moment de la compilation.

En ce sens, c'est vraiment l'une des langues du « départ à gauche ». Il mettra en évidence les erreurs et apprendra aux développeurs la bonne façon d'écrire du code afin d'éviter d'introduire des bogues de sécurité liés à la mémoire. Le respect des délais dépend donc de l'attention du codeur, de la correction et de la fidélité au chemin de livraison.

L'approche de ce langage semble simple, mais cela aurait été un exploit incroyable de le faire fonctionner avec cette puissante logique, et il va de soi. Du point de vue de la sécurité, Rust représente un grand pas en avant... si seulement davantage de personnes l'utilisaient. Des entreprises comme Dropbox sont les premières à utiliser son utilisation à grande échelle, et c'est formidable à voir. Mais il y a d'autres considérations avant de conclure qu'un problème d'adoption est la seule chose qui nous empêche d'avoir un avenir plus sûr.

Les comptes de Rust.

Il y a quelques petits (d'accord, gros) problèmes, à savoir que la programmation dans Rust est plus flexible qu'il n'y paraît pour introduire des bogues. Ce sera pas corrigez les 10 principales vulnérabilités de l'OWASP qui continuent de provoquer des violations, des retards et une culture générale de techniques de codage dangereuses. Il existe également une sorte de dynamique entre les anges et les démons, ou, comme on le sait plus généralement : Safe Rust ou Unsafe Rust.

Comme il est expliqué dans documentation officielle, Safe Rust est la « vraie » forme de Rust, et Unsafe Rust inclut des fonctions considérées comme « définitivement dangereuses », bien qu'elles soient parfois nécessaires, par exemple si l'intégration avec quelque chose dans un autre langage est requise. Cependant, même avec Unsafe Rust, la liste des fonctionnalités supplémentaires est encore limitée. Dans Unsafe Rust, il est possible d'effectuer les opérations suivantes dans des blocs non sécurisés :

  • Déréférencer les pointeurs bruts
  • Appelez des fonctions non sécurisées (y compris les fonctions C, les éléments intrinsèques du compilateur et l'allocateur brut)
  • Implémenter des traits dangereux
  • Muter la statique
  • Accédez aux domaines des syndicats.

Même dans un mode dit « non sécurisé », l'un des super pouvoirs de la programmation Rust fonctionne toujours : le « vérificateur d'emprunt ». Elle permet généralement d'éviter les problèmes de mémoire, les collisions lors de calculs parallèles et de nombreux autres bogues grâce à l'analyse statique du code, et cette analyse permet tout de même d'effectuer des vérifications dans un bloc non sécurisé. L'écriture de constructions non sécurisées demande simplement beaucoup plus de travail sans que le compilateur n'intervienne pour vous guider dans certaines situations.

Cela ne semble pas être un problème majeur pour la plupart des développeurs expérimentés. Après tout, nous sommes connus pour bricoler pour tirer le meilleur parti de nos applications et ouvrir des fonctions plus intéressantes, mais cela ouvre potentiellement un trou noir qui peut entraîner de graves erreurs de configuration et des failles de sécurité : un comportement indéfini. La programmation dans Rust (même lorsqu'elle n'est pas utilisée en toute sécurité) réduit assez bien les possibilités de vulnérabilités par rapport au C ou au C++, mais invoquer un comportement indéfini peut présenter un risque.

Est-ce la fin de la dépendance à l'égard du codage sécurisé piloté par les développeurs ?

Tu te souviens plus tôt quand j'ai dit que Rust avait des composants de langages connus ? L'une des principales failles de sécurité de Rust est qu'il contient des composants de langages bien connus, à savoir le C.

Rust est toujours un « langage de programmation sûr », mais encore une fois, c'est l'introduction d'un utilisateur qui permet de débloquer les choses. Le développeur peut toujours le modifier pour qu'il fonctionne sans signaler d'erreur (une proposition intéressante, car cela permet de débloquer plus de fonctionnalités), et essentiellement, même en toute sécurité, les développeurs peuvent toujours être aussi « dangereux » qu'ils le souhaitent, car ils disposent d'une couche de conseils et de protection avant que les choses ne prennent vraiment la forme d'une poire.

Et les deux scénarios ci-dessus deviennent de plus en plus dangereux à mesure que nous approfondissons, car les résultats de Rust sont similaires à ceux des outils d'analyse. Tout comme il n'existe aucun outil SAST/DAST/RAST/IAST de l'armée suisse qui analyse chaque vulnérabilité, chaque vecteur d'attaque et chaque problème, Rust ne le fait pas non plus. Même avec Rust certaines vulnérabilités peuvent encore être introduites assez facilement.

Le risque comportemental non défini lors de l'exécution de Unsafe Rust peut entraîner des problèmes de dépassement d'entiers, alors qu'en général, même les configurations sûres n'empêcheront pas les erreurs humaines dans les mauvaises configurations de sécurité, logique métier, ou en utilisant des composants présentant des vulnérabilités connues. Ces problèmes constituent toujours une menace bien réelle s'ils ne sont pas corrigés, et dans un environnement « supposé sûr » comme True Rust, cela peut même entraîner un certain comportement complaisant si un codeur pense que tous les problèmes majeurs seront détectés malgré tout.

J'ai découvert que Rust n'est pas sans rappeler un mentor en programmation : un ingénieur senior qui a pris le temps de s'asseoir avec un codeur moins expérimenté, de passer en revue son travail et de lui montrer les bogues potentiels, de souligner les gains d'efficacité et, dans certains cas, de s'assurer qu'il n'est pas compilé tant qu'il n'est pas correct. Cependant, il vaut mieux que les programmeurs de Rust apprennent la théorie et s'engagent eux-mêmes à appliquer les meilleures pratiques, car ce mentor pourrait bien vous couper les ficelles du tablier et vous ne voudriez pas être laissé pour compte.

Êtes-vous prêt à identifier et à corriger les vulnérabilités courantes de Rust dès maintenant ? Relève le défi.

目录

下载PDF文件
显示资源
您想了解更多吗?

Matias Madou, Ph.D.是一位安全专家、研究员和CTO,也是Secure Code Warrior 的联合创始人。Matias在根特大学获得了应用安全的博士学位,主要研究静态分析解决方案。后来他加入了美国的Fortify公司,在那里他意识到,仅仅检测代码问题而不帮助开发人员编写安全代码是不够的。这激发了他开发产品的热情,帮助开发人员,减轻安全的负担,并超越客户的期望。当他不在办公桌前作为Awesome团队的一员时,他喜欢站在舞台上,在包括RSA会议、BlackHat和DefCon等会议上发表演讲。

了解更多

Secure Code Warrior 在整个软件开发周期中保障代码安全,并营造将网络安全置于首位的企业文化。无论您是应用安全负责人、开发人员、信息安全主管,还是其他任何参与安全工作的人员,我们都能协助您的组织降低不安全代码带来的风险。

预约演示下载
分享到:
领英品牌社交x 标志
资源中心

帮助您入门的资源

更多帖子
资源中心

帮助您入门的资源

更多帖子