PVS-Studio dia ao amin'ny Chocolatey izao: manamarina Chocolatey avy amin'ny Azure DevOps

PVS-Studio dia ao amin'ny Chocolatey izao: manamarina Chocolatey avy amin'ny Azure DevOps
Manohy manao ny fampiasana PVS-Studio ho mora kokoa izahay. Misy amin'izao fotoana izao ny mpandinika anay ao amin'ny Chocolatey, mpitantana fonosana ho an'ny Windows. Mino izahay fa hanamora ny fametrahana ny PVS-Studio izany, indrindra amin'ny serivisy rahona. Mba tsy ho lasa lavitra, andeha hojerentsika ny source code an'io Chocolatey io. Azure DevOps dia hiasa ho rafitra CI.

Ity misy lisitry ny lahatsoratray hafa momba ny lohahevitra fampidirana amin'ny rafitra rahona:

Manoro hevitra anao aho mba handinika ny lahatsoratra voalohany momba ny fampidirana amin'ny Azure DevOps, satria amin'ity tranga ity dia misy teboka sasany nesorina mba tsy ho adika.

Noho izany, ny mahery fo amin'ity lahatsoratra ity:

PVS Studio dia fitaovana famakafakana kaody static natao hamantarana ny lesoka sy ny vulnerability mety hitranga amin'ny programa voasoratra amin'ny C, C++, C# ary Java. Mandeha amin'ny rafitra Windows, Linux, ary macOS 64-bit, ary afaka mamakafaka ny kaody natao ho an'ny sehatra ARM 32-bit, 64-bit, ary napetaka. Raha vao sambany ianao no nanandrana famakafakana kaody static hanamarinana ny tetikasanao, dia manoro hevitra anao izahay mba hahalalanao ny tenanao lahatsoratra momba ny fomba hijerena haingana ny fampitandremana PVS-Studio mahaliana indrindra ary manombana ny fahaizan'ity fitaovana ity.

Azure DevOps β€” andiana tolotra rahona izay miara-manarona ny dingana fampandrosoana manontolo. Ity sehatra ity dia ahitana fitaovana toy ny Azure Pipelines, Azure Boards, Azure Artifacts, Azure Repos, Azure Test Plans, izay ahafahanao manafaingana ny fizotran'ny famoronana rindrambaiko sy manatsara ny kalitaony.

Chocolate ary dia mpitantana fonosana loharano misokatra ho an'ny Windows. Ny tanjon'ny tetikasa dia ny hanamboatra ho azy ny fiainan'ny rindrambaiko manontolo manomboka amin'ny fametrahana ka hatramin'ny fanavaozana sy ny fanesorana amin'ny rafitra fiasa Windows.

Momba ny fampiasana Chocolatey

Azonao jerena ny fomba fametrahana ny mpitantana ny fonosana amin'ity rohy. Ny antontan-taratasy feno momba ny fametrahana ny analyse dia azo jerena ao amin'ny rohy Jereo ny Fametrahana mampiasa ny fizarana Chocolatey package manager. Averiko fohifohy ny hevitra sasany avy eo.

Didy hametraka ny kinova farany an'ny mpandinika:

choco install pvs-studio

Didy hametraka dikan-teny manokana amin'ny fonosana PVS-Studio:

choco install pvs-studio --version=7.05.35617.2075

Amin'ny alΓ lan'ny default, ny fototry ny mpandinika, ny singa Core, no napetraka. Ny saina hafa rehetra (Standalone, JavaCore, IDEA, MSVS2010, MSVS2012, MSVS2013, MSVS2015, MSVS2017, MSVS2019) dia azo alefa amin'ny fampiasana --package-parameters.

Ohatra iray amin'ny baiko izay hametraka mpandinika miaraka amin'ny plugin ho an'ny Visual Studio 2019:

choco install pvs-studio --package-parameters="'/MSVS2019'"

Andeha hojerentsika ny ohatra iray amin'ny fampiasana mora ny mpandinika eo ambanin'ny Azure DevOps.

fanitsiana

MamelΓ  ahy hampahatsiahy anao fa misy fizarana manokana momba ny olana toy ny fisoratana anarana kaonty, ny famoronana Build Pipeline ary ny fampifanarahana ny kaontinao amin'ny tetikasa iray hita ao amin'ny tahiry GitHub. lahatsoratra. Hanomboka avy hatrany amin'ny fanoratana rakitra fichier ny fanamboarana.

Voalohany, andeha isika hametraka trigger fanombohana, izay manondro fa ho an'ny fanovana ihany no hanombohana tompony sampana:

trigger:
- master

Avy eo dia mila mifidy milina virtoaly isika. Amin'izao fotoana izao dia ho mpiasan'ny Microsoft miaraka amin'ny Windows Server 2019 sy Visual Studio 2019:

pool:
  vmImage: 'windows-latest'

Andeha isika hiroso amin'ny vatan'ny fichier configuration (block dingana). Na dia eo aza ny zava-misy fa tsy afaka mametraka rindrambaiko tsy misy dikany amin'ny milina virtoaly ianao, dia tsy nanampy container Docker aho. Azontsika atao ny manampy Chocolatey ho fanitarana ny Azure DevOps. Mba hanaovana izany, andeha ho any rohy. tsindrio Ento maimaimpoana. Manaraka, raha efa nahazo alalana ianao dia fidio fotsiny ny kaontinao, ary raha tsy izany dia ataovy toy izany koa aorian'ny fanomezan-dΓ lana.

PVS-Studio dia ao amin'ny Chocolatey izao: manamarina Chocolatey avy amin'ny Azure DevOps

Eto ianao dia mila misafidy izay hampidirana ny fanitarana ary tsindrio ny bokotra hametraka.

PVS-Studio dia ao amin'ny Chocolatey izao: manamarina Chocolatey avy amin'ny Azure DevOps

Rehefa vita ny fametrahana dia tsindrio Mandehana any amin'ny organisation:

PVS-Studio dia ao amin'ny Chocolatey izao: manamarina Chocolatey avy amin'ny Azure DevOps

Azonao atao ny mahita ny mΓ΄dely ho an'ny asa Chocolatey eo amin'ny varavarankely asa rehefa manitsy fisie fanamafisana azure-pipelines.yml:

PVS-Studio dia ao amin'ny Chocolatey izao: manamarina Chocolatey avy amin'ny Azure DevOps

Kitiho ny Chocolatey ary jereo ny lisitry ny saha:

PVS-Studio dia ao amin'ny Chocolatey izao: manamarina Chocolatey avy amin'ny Azure DevOps

Eto isika dia mila misafidy hametraka eny an-kianja miaraka amin'ireo ekipa. IN Anaran'ny fisie Nuspec manondro ny anaran'ny fonosana ilaina - pvs-studio. Raha tsy mamaritra ny dikan-teny ianao dia hapetraka ny farany, izay mifanaraka aminay tanteraka. Aleo tsindrio ny bokotra hametraka ary ho hitantsika ao amin'ny fichier configuration ny asa novokarina.

steps:
- task: ChocolateyCommand@0
  inputs:
    command: 'install'
    installPackageId: 'pvs-studio'

Manaraka, andao hiroso amin'ny ampahany lehibe amin'ny rakitray:

- task: CmdLine@2
  inputs:
    script: 

Ankehitriny dia mila mamorona rakitra miaraka amin'ny fahazoan-dΓ lana analyzer isika. Eto PVSNAME ΠΈ PVSKEY - anaran'ny fari-piadidiana izay faritanay ao amin'ny toe-javatra ny sandany. Hitahiry ny fidirana PVS-Studio sy ny fanalahidin'ny fahazoan-dΓ lana izy ireo. Mba hametrahana ny sandany dia sokafy ny sakafo Variables-> Variable vaovao. Andao hamorona variables PVSNAME ho an'ny fidirana ary PVSKEY ho an'ny fanalahidin'ny analyse. Aza adino ny manamarina ny boaty Ataovy tsiambaratelo izany sanda izany ho an'ny PVSKEY. Kaody baiko:

сall "C:Program Files (x86)PVS-StudioPVS-Studio_Cmd.exe" credentials 
–u $(PVSNAME) –n $(PVSKEY)

Andao hanangana ny tetikasa amin'ny alΓ lan'ny rakitra bat hita ao amin'ny tahiry:

сall build.bat

Andao hamorona lahatahiry iray hitehirizana ny rakitra misy ny valin'ny mpandinika:

сall mkdir PVSTestResults

Andao hanomboka hamakafaka ny tetikasa:

сall "C:Program Files (x86)PVS-StudioPVS-Studio_Cmd.exe" 
–t .srcchocolatey.sln –o .PVSTestResultsChoco.plog 

Mamadika ny tatitray amin'ny endrika html izahay amin'ny fampiasana ny PlogConverter utility:

сall "C:Program Files (x86)PVS-StudioPlogConverter.exe" 
–t html –o PVSTestResults .PVSTestResultsChoco.plog

Mila mamorona asa ianao izao mba hahafahanao mampakatra ny tatitra.

- task: PublishBuildArtifacts@1
  inputs:
    pathToPublish: PVSTestResults
    artifactName: PVSTestResults
    condition: always()

Toy izao ny fichier configuration feno:

trigger:
- master

pool:
  vmImage: 'windows-latest'

steps:
- task: ChocolateyCommand@0
  inputs:
    command: 'install'
    installPackageId: 'pvs-studio'

- task: CmdLine@2
  inputs:
    script: |
      call "C:Program Files (x86)PVS-StudioPVS-Studio_Cmd.exe" 
      credentials –u $(PVSNAME) –n $(PVSKEY)
      call build.bat
      call mkdir PVSTestResults
      call "C:Program Files (x86)PVS-StudioPVS-Studio_Cmd.exe" 
      –t .srcchocolatey.sln –o .PVSTestResultsChoco.plog
      call "C:Program Files (x86)PVS-StudioPlogConverter.exe" 
      –t html –o .PVSTestResults .PVSTestResultsChoco.plog

- task: PublishBuildArtifacts@1
  inputs:
    pathToPublish: PVSTestResults
    artifactName: PVSTestResults
    condition: always()

Aleo tsindrio Save-> Save-> Run hamita ny asa. Andao hisintona ny tatitra amin'ny alΓ lan'ny fandehanana any amin'ny tabilao asa.

PVS-Studio dia ao amin'ny Chocolatey izao: manamarina Chocolatey avy amin'ny Azure DevOps

Ny tetikasa Chocolatey dia tsy misy afa-tsy 37615 andalana C # code. Andeha hojerentsika ny sasany amin'ireo fahadisoana hita.

Valin'ny fitsapana

Fampitandremana N1

Fampitandremana mpandinika: V3005 Ny fari-piadidiana 'mpanome' dia voatendry ho azy. CrytpoHashProviderSpecs.cs 38

public abstract class CrytpoHashProviderSpecsBase : TinySpec
{
  ....
  protected CryptoHashProvider Provider;
  ....
  public override void Context()
  {
    Provider = Provider = new CryptoHashProvider(FileSystem.Object);
  }
}

Ny mpandinika dia nahita fanendrena ny fari-piainana ho azy, izay tsy mitombina. Azo inoana fa tokony hisy iray hafa ho solon'ny iray amin'ireo variable ireo. Eny, na diso izany, ary azo esorina tsotra izao ny fanendrena fanampiny.

Fampitandremana N2

Fampitandremana mpandinika: V3093 [CWE-480] Ny mpandraharaha '&' dia manombatombana ireo operand roa ireo. Angamba ny opΓ©rateur '&&' short-circuit no tokony hampiasaina. Platform.cs 64

public static PlatformType get_platform()
{
  switch (Environment.OSVersion.Platform)
  {
    case PlatformID.MacOSX:
    {
      ....
    }
    case PlatformID.Unix:
    if(file_system.directory_exists("/Applications")
      & file_system.directory_exists("/System")
      & file_system.directory_exists("/Users")
      & file_system.directory_exists("/Volumes"))
      {
        return PlatformType.Mac;
      }
        else
          return PlatformType.Linux;
    default:
      return PlatformType.Windows;
  }
}

Fahasamihafana amin'ny mpandraharaha & avy amin'ny mpandraharaha && dia hoe raha ny ilany havia amin'ny fitenenana dia diso, dia mbola ho kajy ny ilany havanana, izay amin'ity tranga ity dia midika fomba tsy ilaina antso system.directory_exists.

Ao amin'ny sombiny nodinihina dia lesoka kely izany. Eny, ity toe-javatra ity dia azo amboarina amin'ny fanoloana ny & operator amin'ny && operator, fa raha ny fomba fijery azo ampiharina dia tsy misy fiantraikany na inona na inona izany. Na izany aza, amin'ny toe-javatra hafa, ny fisafotofotoana eo amin'ny & sy && dia mety hiteraka olana lehibe rehefa raisina amin'ny soatoavina diso/tsy mety ny ilany havanana amin'ny fiteny. Ohatra, ao amin'ny fanangonanay fahadisoana, fantatra amin'ny fampiasana ny diagnostika V3093, misy ity tranga ity:

if ((k < nct) & (s[k] != 0.0))

Na dia ny index k dia diso, dia hampiasaina hidirana singa iray. Vokatr'izany dia hisy ny fanavahana IndexOutOfRangeException.

Fampitandremana N3, N4

Fampitandremana mpandinika: V3022 [CWE-571] Marina foana ny teny hoe 'shortPrompt'. InteractivePrompt.cs 101
Fampitandremana mpandinika: V3022 [CWE-571] Marina foana ny teny hoe 'shortPrompt'. InteractivePrompt.cs 105

public static string 
prompt_for_confirmation(.... bool shortPrompt = false, ....)
{
  ....
  if (shortPrompt)
  {
    var choicePrompt = choice.is_equal_to(defaultChoice) //1
    ?
    shortPrompt //2
    ?
    "[[{0}]{1}]".format_with(choice.Substring(0, 1).ToUpperInvariant(), //3
    choice.Substring(1,choice.Length - 1))
    :
    "[{0}]".format_with(choice.ToUpperInvariant()) //0
    : 
    shortPrompt //4
    ? 
    "[{0}]{1}".format_with(choice.Substring(0,1).ToUpperInvariant(), //5
    choice.Substring(1,choice.Length - 1)) 
    :
    choice; //0
    ....
  }
  ....
}

Amin'ity tranga ity, misy lojika hafahafa ao ambadiky ny fiasan'ny operatera ternary. Andeha hojerentsika akaiky: raha feno ny fepetra nomarihiko tamin'ny laharana 1 dia hiroso amin'ny fepetra 2 isika, izay foana. marina, izay midika fa hotanterahina ny andalana 3. Raha toa ka diso ny fepetra 1, dia hifindra any amin'ny tsipika misy marika 4 isika, ny fepetra izay misy foana koa. marina, izay midika fa hotanterahina ny andalana 5. Noho izany, ny fepetra voamarika amin'ny fanehoan-kevitra 0 dia tsy ho tanteraka na oviana na oviana, izay mety tsy ho ny lojikan'ny asa izay nandrasan'ny programmer.

Fampitandremana N5

Fampitandremana mpandinika: V3123 [CWE-783] Angamba ny '?:' dia miasa amin'ny fomba hafa tsy araka ny nantenaina. Ny laharam-pahamehany dia ambany noho ny laharam-pahamehan'ny mpandraharaha hafa amin'ny toe-javatra misy azy. Options.cs 1019

private static string GetArgumentName (...., string description)
{
  string[] nameStart;
  if (maxIndex == 1)
  {
    nameStart = new string[]{"{0:", "{"};
  }
  else
  {
    nameStart = new string[]{"{" + index + ":"};
  }
  for (int i = 0; i < nameStart.Length; ++i) 
  {
    int start, j = 0;
    do 
    {
      start = description.IndexOf (nameStart [i], j);
    } 
    while (start >= 0 && j != 0 ? description [j++ - 1] == '{' : false);
    ....
    return maxIndex == 1 ? "VALUE" : "VALUE" + (index + 1);
  }
}

Ny diagnostika dia niasa ho an'ny tsipika:

while (start >= 0 && j != 0 ? description [j++ - 1] == '{' : false)

Avy amin'ny variable j andalana vitsivitsy etsy ambony dia natomboka ho aotra, ny operatera ternary dia hamerina ny sandany diso. Noho io toe-javatra io, ny vatan'ny loop dia hovonoina indray mandeha ihany. Raha ny fahitako azy dia tsy mandeha araka ny nokasain'ny programmer io kaody io.

Fampitandremana N6

Fampitandremana mpandinika: V3022 [CWE-571] Marina foana ny teny hoe 'installedPackageVersions.Count != 1'. NugetService.cs 1405

private void remove_nuget_cache_for_package(....)
{
  if (!config.AllVersions && installedPackageVersions.Count > 1)
  {
    const string allVersionsChoice = "All versions";
    if (installedPackageVersions.Count != 1)
    {
      choices.Add(allVersionsChoice);
    }
    ....
  }
  ....
}

Misy toe-javatra hafahafa eto: installPackageVersions.Count != 1izay ho foana marina. Matetika ny fampitandremana toy izany dia manondro fahadisoana lojika ao amin'ny kaody, ary amin'ny tranga hafa dia manondro fotsiny ny fanamarinana miverimberina.

Fampitandremana N7

Fampitandremana mpandinika: V3001 Misy zana-teny mitovy 'commandArguments.contains("-apikey")' eo ankavia sy eo ankavanan'ny '||' mpandraharaha. ArgumentsUtility.cs 42

public static bool arguments_contain_sensitive_information(string
 commandArguments)
{
  return commandArguments.contains("-install-arguments-sensitive")
  || commandArguments.contains("-package-parameters-sensitive")
  || commandArguments.contains("apikey ")
  || commandArguments.contains("config ")
  || commandArguments.contains("push ")
  || commandArguments.contains("-p ")
  || commandArguments.contains("-p=")
  || commandArguments.contains("-password")
  || commandArguments.contains("-cp ")
  || commandArguments.contains("-cp=")
  || commandArguments.contains("-certpassword")
  || commandArguments.contains("-k ")
  || commandArguments.contains("-k=")
  || commandArguments.contains("-key ")
  || commandArguments.contains("-key=")
  || commandArguments.contains("-apikey")
  || commandArguments.contains("-api-key")
  || commandArguments.contains("-apikey")
  || commandArguments.contains("-api-key");
}

Nandika sy nametaka ireo andalana roa farany ilay mpandrindra nanoratra ity fizarana code ity ary nanadino ny nanitsy azy ireo. Noho izany, tsy afaka nampihatra ny mari-pamantarana ireo mpampiasa Chocolatey apikey fomba roa hafa. Mitovy amin'ireo masontsivana etsy ambony, afaka manolotra ireto safidy manaraka ireto aho:

commandArguments.contains("-apikey=");
commandArguments.contains("-api-key=");

Ny fahadisoana amin'ny kopia mametaka dia manana vintana lehibe hiseho na ho ela na ho haingana amin'ny tetikasa rehetra misy kaody loharano be dia be, ary ny iray amin'ireo fitaovana tsara indrindra hiadiana amin'izy ireo dia ny fanadihadiana static.

PS Ary toy ny mahazatra, ity hadisoana ity dia matetika miseho amin'ny faran'ny fepetra maromaro :). Jereo ny publication "Vokatry ny andalana farany".

Fampitandremana N8

Fampitandremana mpandinika: V3095 [CWE-476] Ny zavatra 'installedPackage' dia nampiasaina talohan'ny nanamarinana azy tamin'ny null. Jereo ny tsipika: 910, 917. NugetService.cs 910

public virtual ConcurrentDictionary<string, PackageResult> get_outdated(....)
{
  ....
  var pinnedPackageResult = outdatedPackages.GetOrAdd(
    packageName, 
    new PackageResult(installedPackage, 
                      _fileSystem.combine_paths(
                        ApplicationParameters.PackagesLocation, 
                        installedPackage.Id)));
  ....
  if (   installedPackage != null
      && !string.IsNullOrWhiteSpace(installedPackage.Version.SpecialVersion) 
      && !config.UpgradeCommand.ExcludePrerelease)
  {
    ....
  }
  ....
}

Fahadisoana mahazatra: zavatra voalohany installPackage dia ampiasaina ary avy eo manamarina tohivakana foana. Ity diagnostika ity dia milaza amintsika momba ny iray amin'ireo olana roa ao amin'ny programa: na installPackage tsy mitovy velively tohivakana foana, izay mampiahiahy, ary avy eo dia mihemotra ny taratasim-panamarinana, na mety hisy hadisoana lehibe amin'ny fehezan-dalΓ na - fiezahana hidirana reference tsy misy dikany.

famaranana

Noho izany dia nanao dingana kely hafa izahay - ny fampiasana PVS-Studio dia lasa mora kokoa sy mora kokoa. Te-hilaza ihany koa aho fa Chocolatey dia mpitantana fonosana tsara misy lesoka kely ao amin'ny code, izay mety ho vitsy kokoa rehefa mampiasa PVS-Studio.

Manasa anao izahay ΡΠΊΠ°Ρ‡Π°Ρ‚ΡŒ ary andramo ny PVS-Studio. Ny fampiasana tsy tapaka ny mpanadihady static dia hanatsara ny kalitao sy ny fahamendrehan'ny kaody namboarin'ny ekipanao ary hanampy amin'ny fisorohana ny maro vulnerability zero andro.

Sal

Talohan'ny namoahana azy dia nalefanay tany amin'ireo mpamorona Chocolatey ilay lahatsoratra, ary noraisin'izy ireo tsara. Tsy nahita na inona na inona mitsikera izahay, fa izy ireo, ohatra, dia tia ilay bibikely hitanay mifandraika amin'ny famaha "api-key".

PVS-Studio dia ao amin'ny Chocolatey izao: manamarina Chocolatey avy amin'ny Azure DevOps

Raha te hizara ity lahatsoratra ity amin'ny mpihaino miteny anglisy ianao dia ampiasao ny rohy fandikana: Vladislav Stolyarov. Ao amin'ny Chocolatey izao ny PVS-Studio: manamarina ny Chocolatey eo ambanin'ny Azure DevOps.

Source: www.habr.com

Add a comment